我有一个大的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中,您可以测试引用计数来检查这一点。) –