一位朋友告诉我,标量属性(BOOL、NSInteger 等)的 @property 默认值是非原子的。IE,
@property BOOL followVenmo;
默认为
@property (nonatomic) BOOL followVenmo;
但是,我一直认为默认值始终是原子的、标量或非标量。
它是哪一个?
一位朋友告诉我,标量属性(BOOL、NSInteger 等)的 @property 默认值是非原子的。IE,
@property BOOL followVenmo;
默认为
@property (nonatomic) BOOL followVenmo;
但是,我一直认为默认值始终是原子的、标量或非标量。
它是哪一个?
小心这个“标量”术语。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
,对象属性的合成访问器只会直接返回值。
为了澄清您是否应该指定一个或另一个:从技术上讲,没有 a 的属性nonatomic
被认为是atomic,但请记住它对原始类型没有意义。因此,您可能希望节省一些输入并避免nonatomic
这些输入。
基于我对其他几个相关问题的研究:
我会遵守@Rhubarb 的建议:
根据经验,如果您不需要多线程支持——如果您使用 UIViewControllers 之类的 UI 代码通常不需要,那么只需将其声明为非原子的。
来自开发者文档
nonatomic 指定访问器是非原子的。默认情况下,访问器是原子的。
原子属性确保您将获得或设置一个完整的值。例如,从 2 个线程设置 CGRect 最终会以一个或另一个结束,而不是两者的某种组合。
对于保留的属性,它还确保结果可以比接收者更长寿。例如,您从另一个线程在调用完成之前释放的对象中获得结果,但结果被保留并代表您自动释放,因此它仍然有效。