我应该为将值存储在集合类中的 setter 使用什么属性关键字



我正在快速浏览一个大型项目以寻找内存泄漏,并在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 属性作为对象获取属性值所有权的文档,但由您来确保确实以某种方式保留它。

最新更新