繁体   English   中英

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

[英]Objective-C: Defaults to atomic for scalar properties?

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

@property BOOL followVenmo;

默认为

@property (nonatomic) BOOL followVenmo;

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

这是什么?

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

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

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

[_internal lock]; // lock using an [_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;

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

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

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

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

基于我对其他一些相关问题的研究:

我将遵守@ Rhubarb的建议

根据经验,如果您不需要多线程支持 - 如果您在UIViewControllers等UI代码中工作,通常不需要多线程支持,那么只需将其声明为非原子的。

来自开发人员文档

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM