ARC当中变量的四种生命周期限定符

__strong

__weak

__unsafe_unretained

__autoreleaseing

  • __strong  是默认的限定符,无需显示引入,只要有强引用指向,对象就会长时间驻留在内存中。可以将__strong理解为reatain调用的ARC版本。
  • __weak  这表明引用不会保持被引用对象的存活。当没有强引用指向对象时,弱引用会被置为nil。可将__weak看作是assign操作符的ARC版本,只是对象被回收时,__weak具有安全性--指针将会被自动设置为nil。但是assign一般用来修饰基本数据类型,基本数据类型存储在由操作系统管理栈中,所以不用担心他什么时候置nil。
  • __unsafe_unretained  与weak类似,只是当没有强引用指向对象时,__unsafe_unretained不会被置为nil。可以将它看作assin的ARC版本。
  • __autoreleaseing 用于有引用使用 id *传递的消息参数。它预期了autorelease方法会在传递参数的方法中被调用。

  

  

Person * __strong p1 = [[Person alloc] init]; //创建对象之后引用计数器 为1,并且对象在p1被引用期不会被释放。
Person * __weak p2 = [[Person alloc] init]; //创建对象之后引用计数器 为0,对象会被立即释放,且p2将被设置为nil
Person * __unsafe_unretained p3 = [[Person alloc] init];//创建对象之后引用计数器 为0,对象会被立即释放,且p2不会被设置为nil

Person * __autoreleasing p4 = [[Person alloc] init]; //创建对象之后引用计数器 为1,当方法返回时对象会被立即释放

属性限定符

strong

  默认,指定了__strong关系, 能保证 对象在其作用于内不会被销毁。

weak

  指定了__weak关系,如果在一个{}作用于定义了一个__weak修饰的对象,由于引用计数器没有+1,创建好就是0,所以创建好了里么就会被销毁置nil。

assign

  ARC当中表示 __unsafe_unreataied关系

copy

  暗指了 __strong关系,它还暗指了 setter中的复制语义。

retain

  指定了__strong关系。ARC中基本不用。

unsafe_unretained

  指定了__unsafe_unretained关系。

注意:

  assign 和 unsage_unretained 只进行值复制而没有任何实质性的检查,所以他们应该用于值类型(BOOL, NSInter, NSUInteger),应该避免将他们用于引用类型,尤其是指针类型,如NSString *, UIView *。

unsage_unretained修饰的对象创建之后会被立即释放,但是内存可能还没有被回收,这个引用可以使用,且不会导致错误。但是再次调用创建这个unsage_unretained修饰的对象的函数时就会出现SIGABRT崩溃。原因,第二次创建调用函数时,对象已经析构,而且内存也被重新分配和使用了,于是导致了非法访问。

最新文章

  1. Highchart.js
  2. win10 MySQL启动失败问题
  3. swiper 增加同页面增加2个滚动
  4. .NET NLog 详解(二)
  5. 每天一个 Linux 命令(13):less 命令
  6. Legends-ggplot2图例的一些操作
  7. 读书雷达 l 业务分析师(BA)篇
  8. 初识Java反射机制
  9. PHP对表单提交特殊字符的过滤和处理
  10. jquery禁用右键单击、F5刷新
  11. 使用Python的requests库进行接口测试——session对象的妙用
  12. es6学习笔记-class之一概念
  13. [经验交流] kubernetes v1.11 更新了高可用方案
  14. WRF 安装备忘
  15. fopen() 返回 NULL, 奇葩原因:当前进程打开多个句柄,忘记关闭。(bug)
  16. HDU2082母函数模板题
  17. 数据层的多租户浅谈(SAAS多租户数据库设计)
  18. NDK官方下载链接
  19. 架构模式数据源模式之:表数据入口(Table Data Gateway)、行数据入口(Row Data Gateway)、活动记录(Active Record)
  20. Springboot 报找不到对应的Mapper接口或RPC接口等问题

热门文章

  1. 如何永久删除git仓库中敏感文件的提交记录
  2. 第三部分:Android 应用程序接口指南---第二节:UI---第九章 搜索
  3. [k8s]coredns/kube-dns配置subdomain
  4. https://stackoverflow.com/questions/51751426/failed-to-run-the-da-platform-trial-vm
  5. Spring-boot初始化创建(一)
  6. AI金融知识自学偏量化方向-了解不同类型的机器学习2
  7. 【javascript】利用 a 标签自动解析 url
  8. Ubuntu下在Apache中运行Keystone
  9. Spring配置-数据库连接池proxool[转]
  10. Java 读取ANSI文件中文乱码问题解决方式[转]