我应该将哪个属性关键字用于将值存储在集合类中的setter

时间:2012-10-06 23:36:00

标签: iphone objective-c memory-leaks cocos2d-iphone

我正在快速查看一个寻找内存泄漏的大型项目,并在@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?

2 个答案:

答案 0 :(得分:1)

retain(或ARC世界中的strong)在您的情况下是正确的,因为您将CSSprite对象添加到另一个保留对象的集合中。

如果您实际上没有使用实例变量来存储对象,那么您也应该在@property中将@dynamic设置为@implementation

答案 1 :(得分:1)

如果您没有使用ARC并且明确地编写了setter方法,那么使用哪个所有权属性并不重要。所有权属性仅在编译器生成setter或(在ARC下)ivar时才重要。

您可以使用retain属性作为对象获取属性值所有权的文档,但是您可以确保实际上以某种方式保留它。