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