在属性声明中,原子和非原子意味着什么?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

这三者之间的操作差异是什么?


当前回答

在单行中:

原子是线程安全的。非原子是线程不安全的。

其他回答

原子意味着只有一个线程访问变量(静态类型)。原子是线程安全的,但它很慢。

非原子意味着多个线程访问变量(动态类型)。非原子线程不安全,但速度很快。

原子:通过使用NSLOCK锁定线程来确保线程安全。

非原子:由于没有线程锁定机制,因此无法确保线程安全。

没有这样的关键字“atomic”

@property(atomic, retain) UITextField *userName;

我们可以使用上面的

@property(retain) UITextField *userName;

请参阅堆栈溢出问题,如果我使用@property(atomic,retain)NSString*myString,我会遇到问题。

原子的

是默认行为将确保当前进程在另一个进程访问变量之前由CPU完成速度不快,因为它可以确保整个过程完全完成

非原子的

不是默认行为更快(对于合成代码,即使用@property和@synthetic创建的变量)非线程安全当两个不同的进程同时访问同一变量时,可能会导致意外行为

原子性原子(默认)

默认为Atomic:如果不键入任何内容,则属性为原子的如果您尝试从它,您将返回一个有效值。它不做任何保证关于这个值可能是什么,但你会得到好的数据,而不是只是垃圾记忆。如果您有多个线程或多个进程指向一个变量,一个线程可以读取,另一个线程可以写入。如果他们同时命中时间,读取器线程保证获得以下两个值之一:在改变之前或改变之后。什么原子没有给你任何形式的保证可能会得到。原子通常与线程安全相混淆,这是不正确的。你需要保证你的线程安全其他方式。然而,atomic将保证,如果您尝试阅读,你会得到某种价值。

非原子的

另一方面,非原子的,正如你可能猜到的,只是意味着,“不要做原子的事情。”你失去的是保证你总是要得到一些东西。如果你试着在写,你可以取回垃圾数据。但另一方面,你去快一点。因为原子财产必须发挥一些魔力为了保证你会得到一个值,它们有点慢。如果这是一个你经常访问的财产,你可能想放弃降到非原子,以确保你不会导致那样的速度处罚通道

礼貌https://academy.realm.io/posts/tmi-objective-c-property-attributes/

原子性属性属性(原子性和非原子性)没有反映在相应的Swift属性声明中,但是当从Swift访问导入的属性时,Objective-C实现的原子性保证仍然有效。

所以 — 如果你在Objective-C中定义了一个原子属性,当Swift使用它时,它仍然是原子属性。

礼貌https://medium.com/@YogevSitton/atomic-vs-非原子属性-拉什课程-d11c23f4366c