Objective-C:标量属性默认为原子?

ma1*_*w28 7 default properties atomic objective-c nonatomic

一位朋友告诉我,标量属性的@property默认值(BOOL,NSInteger等)是非原子的.也就是说,

@property BOOL followVenmo;
Run Code Online (Sandbox Code Playgroud)

默认为

@property (nonatomic) BOOL followVenmo;
Run Code Online (Sandbox Code Playgroud)

但是,我总是认为默认值始终是原子,标量或不是.

这是什么?

sid*_*yll 10

小心这个"标量"术语.NSString*属性也是一个指针,与您提供的指向BOOL的示例完全相同.

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

如果指定retain或未copy指定nonatomic,则在引用计数环境中,对象属性的合成get访问器使用保留并自动释放返回的值 - 实现将类似于以下内容:

[_internal lock]; // lock using anobject-levellock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

您不能在不是对象的东西中应用对象级锁定,因此原始类型属性中的(非)原子基本上没有效果.

您可以得出结论,原子只适用于对象属性,这在文档中得到了加强:

如果指定nonatomic,则对象属性合成访问器只是直接返回值.

为了澄清你是否应该指定一个或另一个:从技术上讲,没有a的属性nonatomic被认为是原子的,但请记住它对原始类型没有意义.因此,您可能希望保存一些打字并避免nonatomic这些.


ma1*_*w28 0

根据我对其他几个相关问题的研究:

我将遵守@Rhubarb 的建议

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