atomicnonatomic在属性声明中是什么意思?

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


这三个之间的操作区别是什么?

最佳答案

后两个相同; “ atomic”是默认行为(请注意,它实际上不是关键字;仅通过缺少nonatomic来指定它-在最新版本的llvm / clang中将atomic添加为关键字)。

假设您正在@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@时,如果要综合方法实现的方法,原子的还是非原子的都会改变生成的代码。如果您正在编写自己的setter / getter,则原子/非原子/保留/分配/复制仅是建议性的。 (注意:@synthesize现在是最新版本的LLVM中的默认行为。也无需声明实例变量;它们也将自动合成,并且在名称前添加_可以防止意外的直接访问)。

使用“ atomic”,合成的setter / getter将确保始终从getter返回或由setter设置整个值,而不管任何其他线程上的setter活动如何。也就是说,如果线程A在getter的中间,而线程B在调用setter时,则实际的可行值(很可能是自动释放的对象)将返回给A中的调用者。

nonatomic中,没有这样的保证。因此,nonatomic比“ atomic”要快得多。

“原子”不做的是对线程安全性做任何保证。如果线程A同时调用B和C的getter,而线程C使用不同的值调用setter,则线程A可能会获得返回的三个值中的任何一个-在调用任何setter之前的值之一,或者将其中一个值传递给setter同样,对象可能以B或C中的值结尾,无法分辨。

确保数据完整性(多线程编程的主要挑战之一)是通过其他方式实现的。

加上:

当多个依赖属性在起作用时,单个属性的atomicity也不能保证线程安全。

考虑:

 @property(atomic, copy) NSString *firstName;
 @property(atomic, copy) NSString *lastName;
 @property(readonly, atomic, copy) NSString *fullName;


在这种情况下,线程A可以通过调用setFirstName:然后调用setLastName:重命名对象。同时,线程B可能在线程A的两次调用之间调用fullName,并且将接收到新的名字以及旧的名字。

为了解决这个问题,您需要一个事务模型。即某种其他类型的同步和/或排除,允许在更新依赖属性时排除对fullName的访问。

关于ios - 原子和非原子属性有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4270179/

10-12 12:52
查看更多