Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 对于在集合类中存储值的setter,应该使用什么属性关键字_Iphone_Objective C_Memory Leaks_Cocos2d Iphone - Fatal编程技术网

Iphone 对于在集合类中存储值的setter,应该使用什么属性关键字

Iphone 对于在集合类中存储值的setter,应该使用什么属性关键字,iphone,objective-c,memory-leaks,cocos2d-iphone,Iphone,Objective C,Memory Leaks,Cocos2d Iphone,我快速浏览了一个大型项目,查找内存泄漏,发现一个@属性(非原子,保留)在dealloc中没有相应的release。哎呀,我想是快解决了 在随后的一次崩溃之后,我仔细观察,发现setFoo方法被覆盖,该值被保留,但不是由ivar保留——为了解决这个问题,假设它被放入NSDictionary中 (好的,如果您不想假设-设置值实际上是cocos2d中的一个CCSprite,setNormalSprite,并且它作为子级添加,因此保留,但只是分配给ivar: - (void)setNormalSpri

我快速浏览了一个大型项目,查找内存泄漏,发现一个
@属性(非原子,保留)
dealloc
中没有相应的
release
。哎呀,我想是快解决了

在随后的一次崩溃之后,我仔细观察,发现
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...)
   }
)

如果某个值的setter导致retain count增加,但不是因为它关联的ivar被保留,那么该值的正确关键字是什么?

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


如果实际上没有使用实例变量来存储对象,那么也应该在
@实现中将
@属性
设置为
@动态

如果您不使用ARC,而是显式地编写setter方法,那么您使用的所有权属性并不重要。所有权属性仅在编译器生成setter或(在ARC下)ivar时才起作用


您可以使用retain属性作为文档,说明对象拥有属性值的所有权,但这取决于您是否确实以某种方式保留了它。

如果您传递与normalSprite相同的sprite,该setter可能会崩溃。这是一个很好的观点,我应该在引号中加上“correct”。我意识到行为不会改变,但我想知道是否有一个共识,即一个关键字或另一个更合适-为可读性,或公约或。。。还有别的事。