7

一位朋友告诉我,标量属性(BOOL、NSInteger 等)的 @property 默认值是非原子的。IE,

@property BOOL followVenmo;

默认为

@property (nonatomic) BOOL followVenmo;

但是,我一直认为默认值始终是原子的、标量或非标量。

它是哪一个?

4

3 回答 3

10

小心这个“标量”术语。NSString * 属性也是一个指针,就像您提供的带有指向 BOOL 的指针的示例一样。

来自 Apple 文档:(Objective-C 编程语言)

如果您指定retaincopy不指定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这些输入。

于 2011-07-26T22:52:47.363 回答
0

基于我对其他几个相关问题的研究:

我会遵守@Rhubarb 的建议

根据经验,如果您不需要多线程支持——如果您使用 UIViewControllers 之类的 UI 代码通常不需要,那么只需将其声明为非原子的。

于 2013-10-28T18:36:26.917 回答
-1

来自开发者文档

nonatomic 指定访问器是非原子的。默认情况下,访问器是原子的。

原子属性确保您将获得或设置一个完整的值。例如,从 2 个线程设置 CGRect 最终会以一个或另一个结束,而不是两者的某种组合。

对于保留的属性,它还确保结果可以比接收者更长寿。例如,您从另一个线程在调用完成之前释放的对象中获得结果,但结果被保留并代表您自动释放,因此它仍然有效。

于 2011-07-26T23:43:17.847 回答