2012-12-13 31 views
1

我收到此错误Objective-C的警告,未声明的标识符的使用 '新'

使用未声明的标识符的 '新'

在这行代码

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对象,但是这让我无法继续前进。

任何帮助将不胜感激。

+0

这种方法工作,是文件转换为zip格式 –

回答

5

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

具体而言,newdelete运算符是C++运算符。它们不在C中。Objective-C是C的超集,Objective-C++是C++的超集。 - 但是,因为这些似乎是唯一的C++在这段代码主义,如果你想与Objective-C的坚持,你可以通过替换两行修复:

  1. (Byte*)malloc(sizeof(Byte) * COMPRESSION_BLOCK)
  2. 更换delete[] decompressedBytes更换new Byte[COMPRESSION_BLOCK]free(decompressedBytes)
+0

啊哈!我以为.mm是示例文件中的错误......非常感谢..所以我怎么能从我的.m文件中调用这些方法之一?因为使用+声明的方法是用于本地使用的方法吗? – HurkNburkS

+0

哦,非常感谢你要去尝试你的新建议:) – HurkNburkS

+0

@HurkNburkS:'+'不代表本地使用。这意味着类方法。所以如果你只是把这个代码放在'.mm'文件中,你可以用'[NSData dataByDecompressingData:someData]'来调用它。确保你有'#import“NSData + zlib.h”'。 –

1

new是一个C++构造,而不是Objective-C。在上面的代码应该大概读

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

和同样的delete[] ...线应该由

free(decompressedBytes); 

更客观-C来代替类似的解决方案是使用NSMutableData它:

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

在这种情况下你不需要发布它(或者[[NSMutableData alloc] initWithLength:...]和上面的发布版本)。

+0

嗨,感谢您的帮助..这段代码工作没有任何警告消息HOWEVER !它是与我正在喂它的数据抛出一个错误....它记录**充气错误:-3 **正在被抛出** CHECK_ERR(错误,@“充气”); **在if( err == Z_STREAM_END)if statment?你认为可能导致这个问题的原因是什么?坏的数据? – HurkNburkS

+0

其实不用担心发现我收到的数据包的标题是干扰解压缩,因为该部分没有压缩:)修复它现在..谢谢你的回应 – HurkNburkS