1

我正在快速浏览一个寻找内存泄漏的大型项目,并遇到了一个@property (nonatomic, retain)没有对应release的 in dealloc. 哎呀,快速修复,我想。

在后来的崩溃之后,我仔细观察并且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 被保留的值的正确关键字是什么?

4

2 回答 2

1

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

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

于 2012-10-06T23:38:29.683 回答
1

如果您没有使用 ARC 并且您正在显式编写 setter 方法,那么您使用什么所有权属性并不重要。所有权属性仅在编译器生成 setter 或(在 ARC 下)ivar 时才重要。

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

于 2012-10-07T00:50:16.137 回答