我有一个很大的 malloc 区域,我想将它包装在一个 NSData 对象中。一段时间后,我复制了那个 NSData 对象。我希望这两个 NSData 对象具有独立的生命周期。ARC 负责对 NSData 对象本身进行引用计数,但我试图澄清包含的 malloc'd 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'd 缓冲区?如果它们都持有对 malloc 缓冲区的引用(使用某种形式的不透明引用计数),那就太好了!但是,如果在释放data
对象时释放了 malloc 的缓冲区(如 暗示的那样freeWhenDone:YES
),data2
则会遇到麻烦。
有人可以解释 NSData 在这种情况下的作用吗?或者,有人可以建议一个明确的测试来向自己证明发生了什么吗?