NSCopying和Objective-C内存管理
苹果的NSCopying状态是NSCopying和Objective-C内存管理,objective-c,memory-management,autorelease,nscopying,Objective C,Memory Management,Autorelease,Nscopying,苹果的NSCopying状态是copyWithZone:返回发送方隐式保留的对象。因此,当该对象添加到NSMutableArray时,似乎应该向该对象发送一条autorelease消息,以保持保留计数平衡(因为数组将保留该对象) 因此,要将一个数组的内容深度复制到另一个数组,我希望如下所示: NSMutableArray *destination = [NSMutableArray array]; // assume MyObject adopts NSCopying for (MyObjec
copyWithZone:
返回发送方隐式保留的对象。因此,当该对象添加到NSMutableArray
时,似乎应该向该对象发送一条autorelease
消息,以保持保留计数平衡(因为数组将保留该对象)
因此,要将一个数组的内容深度复制到另一个数组,我希望如下所示:
NSMutableArray *destination = [NSMutableArray array];
// assume MyObject adopts NSCopying
for (MyObject *obj in myArray)
[destination addObject:[[obj copy] autorelease]];
然而,我注意到一种不同的方法。似乎[ret addObject:[val copy]]
是内存泄漏。然而,我对NSCopying
是个新手,所以我想我会问:当向数组添加复制的对象时,是否应该向该对象发送自动释放消息以保持保留计数平衡?
编辑-更多信息:Clang在删除自动释放后报告潜在内存泄漏。也许链接的答案假设
copy
返回的对象不是发送方隐式保留的对象。是的,它确实需要释放,但我不会在这样的循环中使用autorelease
,而是在每次迭代中手动执行
for (MyObject *obj in myArray)
{
MyObject *copy = [obj copy];
[destination addObject:copy];
[copy release];
}
好吧,这是有道理的。使用
autorelease
是否不正确?还是只会导致性能下降?拷贝仍由阵列保留,因此在这种情况下,在性能方面没有太大差异。但是,如果可以的话,显式发布是一个好习惯,尤其是在紧循环中——更干净的代码。