NSData オブジェクトでラップしたい大規模な malloc 領域があります。しばらくして、その NSData オブジェクトのコピーを作成します。2 つの NSData オブジェクトが独立した存続期間を持つようにしたいと考えています。ARC は NSData オブジェクト自体の参照カウントを処理しますが、含まれている malloc された regionの有効期間を明確にしようとしています。コード スケッチを次に示します。
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 されたバッファーを所有しているのか? それらが両方とも malloc されたバッファーへの参照を保持している場合 (何らかの形式の不透明な参照カウントを使用)、それは素晴らしいことです! しかし、オブジェクトが解放されたときに malloc されたバッファーが解放された場合data
( によって暗示されているようにfreeWhenDone:YES
)、data2
問題が発生します。
この場合、NSDataが何をするのか誰か説明できますか? あるいは、誰かが何が起こっているのかを自分自身に証明するための決定的なテストを提案できますか?