这段代码中的“非原子”是什么意思?
@property(nonatomic, retain) UITextField *theUsersName;
原子和非原子有什么区别?
谢谢
看看 Apple Docs。
基本上,如果您说 nonatomic
,并使用 @synthesize
生成访问器,那么如果多个线程尝试一次更改/读取属性,则可能会发生错误。您可以获得部分写入的值或过度释放/保留的对象,这很容易导致崩溃。 (不过,这可能比原子访问器快得多。)
如果您使用默认值(即 atomic
;过去没有关键字,但有 is now),则 @synthesize
d 方法使用对象级锁来确保对一个单个属性被序列化。正如 Apple 文档所指出的,这并不意味着整个对象都是线程安全的,但单个属性 read/writes 是。
当然,如果您实现自己的访问器而不是使用 @synthesize
,我认为这些声明除了表达您对属性是否以线程安全方式实现的意图之外没有任何作用。
在阅读了这么多文章和 StackOverflow 帖子之后,并制作了演示应用程序来检查变量属性属性后,我决定将所有属性信息放在一起
atomic //默认非原子 strong=retain //默认 weak= unsafe_unretained retain assign //默认 unsafe_unretained copy readonly readwrite //default
所以下面是详细的文章链接,您可以在其中找到上述所有属性,这肯定会对您有所帮助。非常感谢所有在这里给出最佳答案的人!!
iOS 中的可变属性属性或修饰符
atomic 原子意味着只有一个线程访问变量(静态类型)。原子是线程安全的。但是它的性能很慢。原子是默认行为。非垃圾收集环境中的原子访问器(即使用保留/释放/自动释放时)将使用锁来确保另一个线程不会干扰正确设置/获取值。它实际上不是关键字。
例子 :
@property (retain) NSString *name;
@synthesize name;
nonatomic Nonatomic 表示多线程访问变量(动态类型)。非原子是线程不安全的。但它的性能很快。非原子不是默认行为;我们需要在属性属性中添加非原子关键字。当两个不同的进程(线程)同时访问同一个变量时,它可能会导致意外的行为。
例子:
@property (nonatomic, retain) NSString *name;
@synthesize name;
除了已经说过的线程安全之外,非原子属性比原子访问器更快。这不是您通常需要担心的事情,但请记住这一点。由于这个原因,Core Data 生成的属性部分是非原子的。
在多线程程序中,原子操作不能被部分中断,而非原子操作可以。
因此,如果您有一个不希望中断的非原子关键操作,您应该使用互斥锁(或类似的东西)。
如果您指定“原子”,则生成的访问函数有一些额外的代码来防止同时更新。
通过阅读下面的文章,您可以掌握这些东西。
Threading Explained with the nonatomic's purpose
nonatomic - 不是线程安全的
atomic - 线程安全 - 这是默认的属性属性。
“原子”意味着对属性的访问是线程安全的。而“非原子”则相反。当您在 Objective-C 中声明属性时,属性默认是原子的,因此合成访问器提供对属性的稳健访问在多线程环境中——也就是说,无论其他线程同时执行什么,从 getter 或通过 setter 返回的值总是完全检索或设置。但是如果您将属性声明为如下所示的非原子
@property (nonatomic, retain) NSString *myString;
那么这意味着对象属性的合成访问器只是直接返回值。非原子属性的效果取决于环境。默认情况下,合成访问器是原子的。所以非原子比原子快得多。
一种是用于多线程。一个不是
不定期副业成功案例分享
atomic
可避免在访问单个属性时崩溃,但 不 确保对象作为一个整体(即访问单独的属性,例如名字和姓氏)将做正确的事情。