“非原子”属性是什么意思?
-
03-07-2019 - |
题
这段代码中的“非原子”是什么意思?
@property(nonatomic, retain) UITextField *theUsersName;
原子和非原子有什么区别?
谢谢
解决方案
查看 Apple Docs
基本上,如果你说 nonatomic
,并使用 @synthesize
生成访问器,那么如果多个线程试图立即更改/读取属性,则可能发生错误。您可以获得部分写入的值或过度释放/保留的对象,这很容易导致崩溃。 (但这可能比原子访问器快得多。)
如果您使用默认值( atomic
;以前没有关键字,但现在是),然后 @synthesize
d方法使用对象级锁定来确保多次读/写单个属性是序列化的。正如Apple文档指出的那样,这并不意味着整个对象是线程安全的,但是单个属性的读/写是。
当然,如果您实现自己的访问器而不是使用 @synthesize
,我认为这些声明除了表达您是否以线程安全方式实现该属性的意图外什么都不做。
其他提示
在阅读了这么多文章和 StackOverflow 帖子,并制作了演示应用程序来检查变量属性属性后,我决定将所有属性信息放在一起
- 原子//默认
- 非原子的
- 强=保留//默认
- 弱=不安全_未保留
- 保持
- 分配//默认值
- 不安全_未保留
- 复制
- 只读
- 读写 //默认
所以下面是详细的文章链接,您可以在其中找到上述所有属性,这肯定会对您有所帮助。非常感谢所有在这里给出最佳答案的人!
- 原子
- 原子性意味着只有一个线程访问该变量(静态类型)。
- 原子是线程安全的。
- 但它的性能很慢。
- 原子是默认行为。
- 非垃圾收集环境中的原子访问器(即当使用保留/释放/自动释放时)将使用锁来确保另一个线程不会干扰值的正确设置/获取。
- 它实际上不是一个关键字。
例子 :
@property (retain) NSString *name;
@synthesize name;
- 非原子的
- 非原子意味着多个线程访问变量(动态类型)。
- 非原子是线程不安全的。
- 但它的性能很快。
- 非原子不是默认行为;我们需要在 property 属性中添加非原子关键字。
- 当两个不同的进程(线程)同时访问同一个变量时,可能会导致意外的行为。
例子:
@property (nonatomic, retain) NSString *name;
@synthesize name;
除了已经对线程安全性所说的内容之外,非原子属性比原子访问器更快。这通常不需要担心,但请记住。出于这个原因,核心数据生成的属性部分是非原子的。
在多线程程序中,原子操作不能部分通过,而非原子操作可以。
因此,如果您的关键操作是非原子的,并且不想中断,则应使用互斥锁(或类似的东西)。
如果指定“atomic”,则生成的访问函数会有一些额外的代码来防止同时更新。
通常原子意味着对属性的写入/读取作为单个操作发生。 Atomic_operation
" atomic” 表示对该属性的访问是线程安全的。而“非原子”则与之相反。 在Objective-C中声明属性时,默认情况下属性是原子的,以便合成访问器在多线程环境中提供对属性的强大访问,也就是说,从getter返回的值或通过setter设置的值总是被完全检索或者无论其他线程同时执行什么,都要设置。但是,如果您将属性声明为非原子属,如下所示
@property (nonatomic, retain) NSString *myString;
然后它意味着对象属性的合成访问器只是直接返回值。 非原子属性的影响取决于环境。默认情况下,合成访问器是原子的。所以非原子比原子快得多。
一个用于多线程。一个不是