一、atomic与nonatomic

1.相同点

  都是为对象添加get和set方法

2.不同点

  atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢

  nonatomic没有添加安全锁,执行效率快

一般iOS程序中,所有属性都声明为nonatomic。这样做的原因是:
在iOS中使用同步锁的开销比较大, 这会带来性能问题。一般情况下并不要求属性必须是“原子的”,因为这并不能保证“线程安全”(thread safety),若要实现“线程安全”的操作,还需采用更为深层的锁定机制才醒。

例如:一个线程在连续多次读取某个属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读取到不同的属性值。

二、assign,copy与retain

assign: 简单赋值,不更改索引计数(Reference Counting)。

copy: 建立一个索引计数为1的对象,然后释放旧对象

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

这里做一个简单的隐喻:

在系统内存中malloc 创建了一个房子A(及为对象分配内存),我A的地址告诉管理者a,(A房子管理者数+1)

情况1、assign  b来的情况,由于是弱对象,管理a只能给b间接使用权,不告诉它地址,所以管理者还是只有a一个,这个时候因为b是弱对象,a如果离开了,A这个房子就没管理者了。A房子就会被系统收回,b成为野孩子了,野孩子乱找内存操作容易导致系统奔溃。

情况2、retain c 来的情况,c拥有一个地址拷贝技能,拷贝了a知道的A房子的地址住所,然后把a谋杀了,系统(A房子管理者数-1),同时c成为新的管理者(A房子管理者数+1)

情况3、copy d来的情况,d有一个好的技能,看到好的东西立马拷贝一份专属自己的,d给拷贝来的新房子命名成D,系统划分了一个新的底盘给d(D房子管理者数+1),然后d把a也谋杀了,(A房子管理者数-1),A房子没有管理者,系统回收了A房子这块地

三、weak 和strong的区别:

(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放  ,即使还有weak型指针指向它。

一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。

可能有个例子形容是妥当的。

想象我们的对象是一条狗,狗想要跑掉(被释放)。

strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。

weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。

只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

使用建议:

当用copy时,set方法会先release旧值,再copy一个新的对象,reference count 为1(减少了对上下文的依赖);当用assign,直接赋值,无retain操作。当用retain,release旧值,retain新值;
非ARC
• 1> copy : 只用于NSString\block
• 2> retain : 除NSString\block以外的OC对象
• 3> assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign
•2.ARC
• 1> copy : 只用于NSString\block
• 2> strong : 除NSString\block以外的OC对象
• 3> weak : 当2个对象相互引用,一端用strong,一端用weak
4> assgin : 基本数据类型、枚举、结构体(非OC对象)

NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;

block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区.在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但写上 copy 也无伤大雅,还能时刻提醒我们:编译器自动对 block 进行了 copy 操作。如果不写 copy ,该类的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy 操作”,他们有可能会在调用之前自行拷贝属性值。这种操作多余而低效。
下面做下解释: copy 此特质所表达的所属关系与 strong 类似。然而设置方法并不保留新值,而是将其“拷贝” (copy)。 当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString 类的实例。这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。
用@property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

单独介绍下copy使用Nsstring

推荐这个博客,解释详细http://blog.csdn.net/itianyi/article/details/9018567

引用里面的第一句话其实说白了,对字符串为啥要用这两种方式?我觉得还是一个安全问题,比如声明的一个NSString *str变量,然后把一个NSMutableString *mStr变量的赋值给它了,如果要求str跟着mStr变化,那么就用retain;如果str不能跟着mStr一起变化,那就用copy。而对于要把NSString类型的字符串赋值给str,那两都没啥区别。不会影响安全性,内存管理也一样。

转载于:https://www.cnblogs.com/iOS-liufei/p/6113601.html

【iOS atomic、nonatomic、assign、copy、retain、weak、strong】的定义和区别详解相关推荐

  1. nonatomic, retain,weak,strong用法详解

    strong weak strong与weak是由ARC新引入的对象变量属性 ARC引入了新的对象的新生命周期限定,即零弱引用.如果零弱引用指向的对象被deallocated的话,零弱引用的对象会被自 ...

  2. iOS assign copy retain...含义

    assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 Copy其实是建立 ...

  3. iOS MJRefresh下拉刷新(上拉加载)使用详解

    下拉刷新控件目前比较火的有好几种,本人用过MJRefresh 和 SVPullToRefresh,相对而言,前者比后者可定制化.拓展新都更高一点. 因此本文着重讲一下MJRefresh的简单用法. 导 ...

  4. (0022)iOS 开发之@property的属性Weak Strong的深入学习

    最近做项目发现经常有一些疑惑,发现一些天天写的代码理解的不是很清楚,于是准备对一些问题进行彻底的总结.深究,以此夯实基础!记录在案. 1.@property 的介绍: 与@synthesize配对使用 ...

  5. 创建对象时引用的关键字,assign,copy,retain

    创建对象时引用的关键字: assign: 简单赋值,不更改索引计数(强引用) copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对 ...

  6. iOS开发 -------- Block技术中的weak - strong

    一 Block是什么? 我们使用^运算符来声明一个Block变量,而且在声明完一个Block变量后要像声明普通变量一样,后面要加; 声明Block变量 int (^block)(int) = NULL ...

  7. iOS开发之runtime(16):设置/获取section数据详解

    背景 在前面的文章中,笔者有讲解如何设置以及获取一个section的数据,demo如下: #import <Foundation/Foundation.h> #import <dlf ...

  8. iOS中 最新微信支付/最全的微信支付教程详解 韩俊强的博客

    亲们, 首先让我们来看一下微信支付的流程吧. 1. 注册微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些参数. 2. 下载微信支付sdk 3. 客户端请求 ...

  9. IOS 定义手势监听器详解,利用 UIGestureRecognizer 进行捏合、旋转、平移、点击、长按手势事件响应

    IOS中我们可以通过UITouch进行触摸事件监听,但是UITouch实现捏合.旋转.长按等手势事件监听非常麻烦.IOS中提供 UIGestureRecognizer 的子类帮我们简洁等实现捏合.旋转 ...

最新文章

  1. Linux下php5.3编译oracle客户端
  2. 医学影像PACS系统解决方案与成功案例汇总
  3. Linux、Mac 命令行快捷键
  4. 云效(原RDC)+ 容器服务完成持续集成
  5. 【elasticsearch】es直接put一个数据到es Can‘t merge because of conflicts Cannot update enabled setting _source
  6. 数据结构上机实践第14周项目1(2) - 验证算法(分块查找)
  7. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_14-异常处理-异常处理的问题分析...
  8. js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型--bin识别
  9. 爬取奇迹秀工具箱里面的文本和软件网盘链接
  10. 从OPPO TWS耳机看OPPO声学的体面回归
  11. 计算机技术专硕能考博吗,专硕不可以考博吗
  12. 写给小白的Python之006:数据类型之列表
  13. insgram 网页分享_instagram网页版登陆使用图文教程
  14. mt7620n华硕固件下载_无法安装Windows10,这台电脑磁盘布局不受UEFI固件支持解决方法...
  15. usrp n310测试总结---测试结果篇(不仅仅是测试结果,还有方法哦)
  16. android蓝牙同步拨打电话状态,还不会用华为Watch打电话?这六个步骤要记清!
  17. Visual studio 2017 安装
  18. 如何用photoshop来做流体渐变
  19. 联想t450进入bios设置按哪个键_thinkpad笔记本怎么进bios设置|联想thinkpad开机进bios按哪个键-系统城...
  20. 阿里云平台创建 centos系统ECS 实例快速入门 (创建及释放ECS)

热门文章

  1. PUSHA/PUSHAD POPA/POPAD 指令详解
  2. S3C2440 中断相关寄存器小探
  3. 【快乐水题】229. 求众数 II
  4. 【⚠️阴沟里翻船,这题都做错了!⚠️】C语言宏定义
  5. zcmu1157: 新年彩灯Ⅱ(二维树状数组)
  6. python中do的用法,如何使用docplex(python)对优化问题中的约束进行建模?
  7. ajax原理 博客,AJAX工作基本原理
  8. php接口返回错误码,laravel 错误处理,接口错误返回json代码
  9. wincc 报警记录 mysql_wincc查询历史报警记录,归档数据-工业支持中心-西门子中国...
  10. python正则表达式修饰符_python正则表达式,看完这篇文章就够了...