当我为一个Mutable接口声明一个属性时,我应该总是这样做(非原子,复制)吗?我何时才会使用assign而不是retain?
答案 0 :(得分:1)
当您更关心性能而不是线程安全时,请使用nonatomic
。原子属性是线程安全但速度较慢。默认行为是atomic
。
如果希望在为属性设置新值时进行复制,请使用copy
。请注意,在许多情况下,copy
实际上不会复制对象,因此这通常不会对性能产生影响,但如果有人为您提供可变副本(例如,您有NSString
,则可以解决错误属性和某人分配NSMutableString
。
请勿使用retain
或strong
,因为只有在ARC关闭时才需要这些,并且您应始终打开ARC。 strong
和retain
相同,这是启用ARC的默认行为。只需打开ARC并忽略这些,但向后兼容的代码除外。
有时,例如使用retain
或strong
的委托属性会产生内存泄漏。在这些情况下,您需要使用weak
或assign
。一般情况下,您应该使用weak
,因为assign
可能会遇到罕见的边缘案例错误。
答案 1 :(得分:0)
通常,您在类实现中@synthesize
创建一个设置函数的属性。您可以编写自己的属性集函数,并在那里进行可变复制。问题解决了...
- (void)setPropertyName:(propertyType *)newProperty {
if (propertyName) [propertyName release];
propertyName = [newProperty mutableCopy];
}