2012-12-13 29 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