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”。我意识到行为不会改变,但我想知道是否有一个共识,即一个关键字或另一个更合适-为可读性,或公约或。。。还有别的事。