gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:00:59 25 4
gpt4 key购买 nike

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 最新版本的默认行为。也不需要声明实例变量;它们也会自动合成,并且会在它们的名称前加上一个 _以防止意外的直接访问)。

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

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

“原子”做的是保证线程安全。如果线程 A 正在同时调用 getter,而线程 B 和 C 使用不同的值调用 setter,则线程 A 可能会获得返回的三个值中的任何一个——调用任何 setter 之前的值或传递给 setter 的任何一个值在 B 和 C 中。同样,对象可能以 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/53028306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com