ios - 原子属性和非原子属性有什么区别?

标签 ios objective-c properties atomic nonatomic

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

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

这三者在操作上有什么区别?

最佳答案

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

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

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

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

“原子”做的是对线程安全做出任何保证。如果线程 A 与线程 B 和 C 同时调用 getter,同时线程 B 和 C 使用不同的值调用 setter,则线程 A 可能会获取返回的三个值中的任何一个 - 调用任何 setter 之前的值或传递到 setter 的值之一同样,该对象最终可能会得到 B 或 C 中的值,无法判断。

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

添加到此:

当多个依赖属性起作用时,单个属性的原子性也无法保证线程安全。

考虑:

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

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

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

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

相关文章:

ios - LLDB 命令 : 'fr v var' vs 'p var'

macos - UILabel/NSTextView 与 CATextLayer

ios - 如何在 iOS 中给定中心点和角度画线?

.net - 是否可以通过反射设置私有(private)属性?

android - 智能手机(Android、iOS 等)上的 DRM

ios - 查找给定月份开始工作日的日期的工作日

c# - 静态字段或属性是否初始化一次?

c# - 在 C# 中使用 "template"在类中实现类似的属性

ios - 使用 iOS SDK 从 microsoft-band 访问心率数据

ios - 方法调配不适用于 iOS 10.1