1

我收到此错误

使用未声明的标识符“新”

在这行代码上

Byte* decompressedBytes = new Byte[COMPRESSION_BLOCK];

这是我出现这行代码的方法。

//  Returns the decompressed version if the zlib compressed input data or nil if there was an error
+ (NSData*) dataByDecompressingData:(NSData*)data{
    Byte* bytes = (Byte*)[data bytes];
    NSInteger len = [data length];
    NSMutableData *decompressedData = [[NSMutableData alloc] initWithCapacity:COMPRESSION_BLOCK];
    Byte* decompressedBytes = new Byte[COMPRESSION_BLOCK];

    z_stream stream;
    int err;
    stream.zalloc = (alloc_func)0;
    stream.zfree = (free_func)0;
    stream.opaque = (voidpf)0;

    stream.next_in = bytes;
    err = inflateInit(&stream);
    CHECK_ERR(err, @"inflateInit");

    while (true) {
        stream.avail_in = len - stream.total_in;
        stream.next_out = decompressedBytes;
        stream.avail_out = COMPRESSION_BLOCK;
        err = inflate(&stream, Z_NO_FLUSH);
        [decompressedData appendBytes:decompressedBytes length:(stream.total_out-[decompressedData length])];
        if(err == Z_STREAM_END)
            break;
        CHECK_ERR(err, @"inflate");
    }

    err = inflateEnd(&stream);
    CHECK_ERR(err, @"inflateEnd");

    delete[] decompressedBytes;
    return decompressedData;
}

我不确定为什么会这样。这段代码来自ObjectiveZlib并且已经通读了好几次,我并没有尝试在我自己的代码中使用它来解压缩 zlib NSData 对象,但是这阻止了我的进步。

任何帮助将不胜感激。

4

2 回答 2

7

这段代码是 Objective-C++。您正在尝试将其编译为 Objective-C。将文件重命名为结束.mm而不是,.m它应该可以工作。

具体来说,newanddelete运算符是 C++ 运算符。它们在 C 中不存在。Objective-C 是 C 的超集,而 Objective-C++ 是 C++ 的超集。然而,由于这些似乎是这段代码中唯一的 C++ 主义,如果你宁愿坚持使用 Objective-C,你可以通过替换两行来修复它:

  1. 替换new Byte[COMPRESSION_BLOCK](Byte*)malloc(sizeof(Byte) * COMPRESSION_BLOCK)
  2. 替换delete[] decompressedBytesfree(decompressedBytes)
于 2012-12-13T02:57:59.660 回答
1

new是 C++ 构造,而不是 Objective-C。在上面的代码中,它可能应该是

Byte* decompressedBytes = (Byte*) malloc(COMPRESSION_BLOCK);

同样,该delete[] ...行应替换为

free(decompressedBytes);

一个更类似于 Objective-C 的解决方案是使用NSMutableData它:

Byte *decompressedBytes = (Byte*)
   [[NSMutableData dataWithLength: COMPRESSION_BLOCK] mutableBytes];

在这种情况下,您不需要发布它(或[[NSMutableData alloc] initWithLength:...]发布上述版本)。

于 2012-12-13T03:05:56.083 回答