一位朋友告诉我,标量属性的@property默认值(BOOL,NSInteger等)是非原子的。即,
@property BOOL followVenmo;
默认为
@property (nonatomic) BOOL followVenmo;
但是,我总是认为默认值始终是原子,标量或不是。
这是什么?
答案 0 :(得分:10)
小心这个“标量”术语。 NSString *属性也是一个指针,与您提供的指向BOOL的示例完全相同。
来自Apple文档:( Objective-C编程语言)
如果您指定
retain
或copy
且未指定nonatomic
,则引用计数环境,对象属性的综合get访问器使用锁,保留并自动释放返回值 - 实现将是类似于以下内容:
[_internal lock]; // lock using an
的object-level
强>lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
您不能在不是对象的内容中应用对象级锁定,因此基本类型属性中的(非)原子基本上没有效果。
您可以得出结论 atomic 仅适用于对象属性,这在文档中得到了加强:
如果您指定
nonatomic
,则对象属性的合成访问者 只会直接返回该值。
澄清你是否应该指定一个或另一个:从技术上讲,没有nonatomic
的属性被认为是 atomic ,但请记住它对于原始类型没有意义。因此,您可能希望保存一些输入并避免使用nonatomic
。
答案 1 :(得分:0)
基于我对其他几个相关问题的研究:
我将遵守@Rhubarb's recommendation:
根据经验,如果您不需要多线程支持 - 如果您正在使用UIViewControllers等UI代码,那么通常不需要多线程支持,那么只需将其声明为非原子。
答案 2 :(得分:-1)
<强>非原子强> 指定访问者是非原子的。 默认情况下, 访问者是原子的。
原子属性可确保您获得或设置整个值。例如,从2个线程设置CGRect将最终得到一个或另一个,而不是两者的某种组合。
对于保留属性,它还确保结果可以比接收器更长。例如,您从调用完成之前由另一个线程释放的对象获得结果,但结果将保留并代表您自动释放,因此它仍然有效。