1

このエラーが発生しています

宣言されていない識別子「new」の使用

このコード行で

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 に固執する場合は、次の 2 行を置き換えることで修正できます。

  1. new Byte[COMPRESSION_BLOCK]と置き換えます(Byte*)malloc(sizeof(Byte) * COMPRESSION_BLOCK)
  2. delete[] decompressedBytesと置き換えますfree(decompressedBytes)
于 2012-12-13T02:57:59.660 に答える
1

newObjective-C ではなく、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 に答える