我正在快速浏览一个大型项目以寻找内存泄漏,并在dealloc
中遇到了一个没有相应release
的@property (nonatomic, retain)
。 哎呀,快速修复,我想。
在后来的崩溃之后,我仔细观察,setFoo
方法被覆盖,并且值被保留但不被 ivar 保留 - 为了这个问题,假设它被放入 NSDictionary 中。
(好吧,如果你不想假设 - 设置值实际上是 cocos2d 中的一个 CCSprite,setNormalSprite
,它被添加为子级,因此保留,但只是分配给 ivar:
- (void)setNormalSprite:(CCSprite *)sprite
{
if (normalSprite) {
[self removeChild:normalSprite cleanup:YES];
normalSprite = nil;
}
normalSprite = sprite;
[self addChild:normalSprite];
(...omitted...)
}
)
对于其资源库导致保留计数增加的值的正确关键字是什么,而不是因为它关联的 ivar 被保留?
retain
(或 ARC 世界中的strong
)在您的情况下是正确的,因为您要将CSSprite
对象添加到保留该对象的另一个集合中。
如果您实际上没有使用实例变量来存储对象,则也应该将@property
设置为@implementation
中的@dynamic
。
如果您没有使用 ARC 并且显式编写了 setter 方法,那么您使用什么所有权属性并不重要。所有权属性仅在编译器生成资源库或(在 ARC 下)ivar 时才有意义。
您可以使用 retain 属性作为对象获取属性值所有权的文档,但由您来确保确实以某种方式保留它。