atomic 和noatomic

nonatomic:非原子的,非线程安全的,适合内存小的移动设备
atomic:原子的,线程安全的

不写的话默认就是atomic,atomic 和 nonatomic 的区别在于,系统自动生成的 getter/setter 方法不一样。如果你自己写 getter/setter,那 atomic/nonatomic/retain/assign/copy 这些关键字只起提示作用,写不写都一样

  • 一般iOS程序中,所有属性都声明为nonatomic
    这样做的原因是:在iOS中使用同步锁的开销比较大, 这会带来性能问题。一般情况下并不要求属性必须是“原子的”,因为atomic并不能保证“线程安全”(thread safety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才行。
    例如:一个线程在连续多次读取某个属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读取到不同的属性值。
    原因如下:
    假设有一个 atomic 的属性 "name",如果线程 A 调[self setName:@"A"],线程 B 调[self setName:@"B"],线程 C 调[self name],那么所有这些不同线程上的操作都将依次顺序执行——也就是说,如果一个线程正在执行 getter/setter,其他线程就得等待。因此,属性 name 是读/写安全的。
    但是,如果有另一个线程 D 同时在调[name release],那可能就会crash,因为 release 不受 getter/setter 操作的限制。

atomic属性只能说是读/写安全的,但并不是线程安全的,因为别的线程还能进行读写之外的其他操作。线程安全需要开发者自己来保证。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • atomic和noatomic的区别是什么?刚刚学iOS的时候是这样认识的:atomic是线程安全的,但它运行效率...
    饭饭男阅读 2,164评论 0 4
  • 好习惯养成 1.运动 29/31 2.周检视 4/4 3.月检视 2/12 4.原著阅读 21/31 5. 简书写...
    lijutong_010阅读 327评论 0 2
  • 现在快午夜十二点 第一次在网上写文章 有点不习惯 当笔变成键盘 不知该写什么 就刚刚去吃夜宵 朋友许久没见 好像有...
    傑丶阅读 198评论 0 1
  • 雅思集训 课程反馈 时间:2017年11月22日 学员:郭孝琛 课上优缺点:今天课堂效率非常高,除了精讲作业,还详...
    迪赛英语Sabrina阅读 280评论 0 0