我有一個大的malloc'd區域,我想包裝在一個NSData對象。一段時間後,我製作了一個NSData對象的副本。我希望兩個NSData對象獨立生活。 ARC負責重新計算NSData對象本身,但我試圖澄清包含malloc'd區域的的生命週期。這裏有一個代碼草圖:NSData的內容是否單獨參考?
float* cubeData = (float*)malloc(cubeDataSize);
printf("cubeData=%p\n", cubeData);
// cubeData=0x01beef00
for (...) { /* fill the cubeData array */ }
NSData* data = [NSData dataWithBytesNoCopy:cubeData length:cubeDataSize
freeWhenDone:YES];
NSData* data2 = [data copyWithZone:nil]
printf("data.bytes=%p data2.bytes=%p\n", data.bytes, data2.bytes);
// data.bytes=0x01beef00 data2.bytes=0x01beef00
這是一個與我行認爲copyWithZone不深拷貝malloc分配區域 - 我可以使用[NSData dataWithData:]
如果我想有一個深拷貝。什麼是不明確的(我不知道如何最好的測試)是哪個NSData對象擁有底層malloc'd緩衝區?如果它們都持有對malloc'd緩衝區的引用(使用某種形式的不透明引用計數),那太棒了!但是,如果在釋放data
對象(如freeWhenDone:YES
所暗示)時釋放malloc'd緩衝區,那麼data2
就會遇到麻煩。
有人可以解釋什麼NSData在這種情況下呢?另外,有人可以提出一個明確的測試來證明自己是怎麼回事?
一段好日子記錄數據和數據2的指針地址。 'NSLog(@「%p%p」,data,data2);';-) –
@MatthiasBauch:你的意思就像例子中的最後一行? :-)(我用'printf'代替'NSLog') –
「如果是,則返回的對象獲取字節指針的所有權並在解除分配時釋放它。」這對我說,你最好不要指望超越第一個NSData生命週期的緩衝區。但是,第二個NSData可能會增加第一個NSData的引用計數,因此第一個NSData不會在第二個NSData執行之前變爲poof。 (在非ARC中,您可以測試引用計數來檢查這一點。) –