属性readwrite、readonly、assign、retain、copy、nonatomic各是什么作用,在哪种情况下用?

1.readwrite:修饰对象可读可写,会生成getter和setter方法
2.readonly:修饰对象仅可读,只生成getter方法
3.assign:修饰基本数据类型(NSInteger,CGFloat)和C数据类型(int, float, double, char)
4.retain:修饰对象类型,指定强引用与strong一样,引用计数+1
5.copy:深拷贝,源对象引用计数不变,副本对象引用计数+1,常用修饰字符串

  • copy 与 retain 的区别
    copy: 创建一个新的对象,新的对象引用计数加1,被copy对象的引用计数不变,改变新拷贝的对象时,被拷贝的对象不会发生改变,两者无直接联系
    retain:创建一个指针,对象的引用计数加1,两个指针同时指向同一对象,新旧指针都可以改变对象的值
    retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1。也就是说,retain 是指针拷贝,copy 是内容拷贝。

6.nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,不用耗费系统资源,可以提高效率。

  • nonatomic和atomic对比
    atomic:线程安全,需要消耗大量的资源
    nonatomic:非线程安全,适合内存小的移动设备

总结
关于nonatomic是线程不安全的,当有多个线程同时修改属性name的值的时候,拿到的结果可能不是自己想要的,因为当属性设置nonatomic的话是允许多个线程是可以同时修改name的值。
简单来说atomic是串行,nonatomic是并行,但如果要真正实现防止多线程修改某属性的值的时候,单单设atomic是不够的,还需要更完善的防止手法

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

推荐阅读更多精彩内容

  • 307、setValue:forKey和setObject:forKey的区别是什么? 答:1, setObjec...
    AlanGe阅读 1,592评论 0 1
  • #synthesize关键字: 根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来...
    CCSHCoder阅读 710评论 1 6
  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,014评论 1 16
  • 多线程、特别是NSOperation 和 GCD 的内部原理。运行时机制的原理和运用场景。SDWebImage的原...
    LZM轮回阅读 2,043评论 0 12
  • 《麦肯锡方法》【美】艾森.拉塞尔 1.做在事前 将所有的讨价还价、争取资源等工作做在事情开始之前。先做坏人,才有机...
    宵汀阅读 332评论 0 3