• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:45:08 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

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



Best Answer-推荐答案


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

假设您正在@synthesizing 方法实现,原子与非原子会更改生成的代码。如果您正在编写自己的 setter/getter,则 atomic/nonatomic/retain/assign/copy 只是建议性的。 (注意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 中的值结束,无法判断。

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

补充:

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

考虑:

 @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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap