`
java-mans
  • 浏览: 11434361 次
文章分类
社区版块
存档分类
最新评论

ARC小结

 
阅读更多

1. Ownership Qualifiers

  • __strong-- 不使用任何修饰符的情况下,默认是__strong。在ARC环境下,编译器会自动为__strong修饰的对象指针生成恰当的release代码,比如出了对象所属作用域,或者发生指针赋值时。
  • __weak-- 使用__weak修饰符,编译器(准确说是Runtime System)会记录被修饰的指针,当指向对象被释放时,将用__weak修饰的指针全部置为nil。如果在非ARC环境下,假设a.delegate = b,通常delegate属性为assign,如果b被释放了,a继续用delegate指针访问,有可能导致程序崩溃。这时候可以模拟__weak特性,让b记录下a.delegate指针,在dealloc时将其置为nil。使用__weak指针,也可以消除循环引用
  • __unsafe__unretained-- 与__weak的差别就在于对象被释放后,不会将指针置为nil,所以最好是使用__weak,比较安全。通常为了支持iOS 4或者OS X 雪豹才使用__unsafe__unretained。
  • __autoreleasing-- 顾名思义,该修饰符是将对象指针向自动释放池注册。在ARC环境下,可以使用@autoreleasepool {} 快速建立自动释放池,并且编译器会关注函数返回值,在需要时为其进行注册。比如 + (id)array { return [[NSMutableArray alloc] init]; },按理说出了作用域,对象会被释放,但这里编译器会将该对象注册到自动释放池中。比如为了安全使用__weak指针,编译器也会自动将对象注册到自动释放池中。有一点不同的是,无修饰符的对象指针默认是__strong,而无修饰符的id指针(或者是对象指针的指针)则默认为__autoreleasing。

2. Rules of ARC

  • 忘掉retain、release、retainCount和autorelease。以前我们在需要安全使用一个对象时,往往会将该对象retain住,在不需要的时候进行release。在ARC环境下这么做会有编译错误,所以记住上面那四个修饰符就好。
  • 忘掉NSAllocateObject和NSDeallocateObject。我个人压根没用过这两个函数,具体可以查看这里这里这里以及这里
  • 创建对象的方法需要遵循一定的命名规则。以alloc、new、copy、mutableCopy开头的函数表示调用者对被创建的对象拥有所有权,以init开头的函数表示对对象进行初始化。这些函数需要是实例方法(而非类方法),并且返回一个对象。
  • 不要显示调用dealloc。比如在dealloc函数中不要加[super dealloc],否则会有错误“ARC forbids explicit message send of 'dealloc'”。
  • 使用@autoreleasepool代替NSAutoreleasePool
  • 忘掉NSZone。关于NSZone,这里有一份详细文档。
  • 对象类型变量不能作为C语言中结构体(struct)或共用体(union)的成员
  • id和void *必须显示转换。这里涉及到三个关键字:__bridge、__bridge_retained和__bridge_transfer,比如void *p = (__bridge void *)obj。三个关键字分别表示没有所有权转移的类型转换、前后都拥有所有权的类型转换以及所有权转移(交接)的类型转换。

3. Implementation

  • __strong -- 编译器会帮我们在变量出作用域时添加release动作,如果该变量是函数返回值,增添加到自动释放池中。
  • __weak -- 编译器和Runtime System维护一张weak表,在给一个__weak指针赋值时,会将指针地址和指向对象作为key-value注册到表中。当指向对象被释放时,搜索表将指针置为nil,并移除该表项。
P.S. 还没真正用过ARC,以上只是很肤浅的“纸上谈兵”。另外,我觉得刚开始不用ARC比较好,能清晰地理解引用计数方式的内存管理,犯几次错误更深刻。LOL

原文地址:http://blog.csdn.net/jasonblog/article/details/7787050
Jason Lee @ Hangzhou

分享到:
评论

相关推荐

    weak,Strong指针小结

    ARC的判断准则: 只要没有强指针指向对象,就会释放对象,弱指针不会这样,及时有弱指针指向对象,对象没有强指针指向,也会自动释放掉。一般,无需显式声明为强指针,但是在封装里,定义方法的时候需要写明。而弱...

    AE删除图层

    AE 学习小结---toccontrol右键菜单删除图层 在ArcEngine中实现右键菜单可以用vs的ContexMenuStrip,也可以使用ae中的IToolbarMenu,在toccontrol中我使用的是前者。 先双击工具栏上的ContexMenuStrip,添加删除图层和...

    [Flash.ActionScript.3.0动画教程

    1.3 动态动画 VS 静态动画小结 第2章ActionSript 3.0动画基础 2.1 动画基础 2.2 关于ActionSript版本 2.3 类和面向对象编程 2.3.1 基类 2.3.2 包(Package) 2.3.3 导入(Import) 2.3.4 构造函数(Constructor) 2.3.5 ...

    visio教程PDF

    1.7 小结 第2章 Visio 2000工程环境 2.1 操作Welcome to Visio 2000窗口 2.1.1 难备新的绘图 2.1.2 准备打开一个已经存在的文件 2.2 基本下拉菜单 2.2.1 File下拉菜单 2.2.2 Tools下拉菜单 ...

    Visio 2000 技术大全

    1.7 小结 第2章 Visio 2000工程环境 2.1 操作Welcome to Visio 2000窗口 2.1.1 难备新的绘图 2.1.2 准备打开一个已经存在的文件 2.2 基本下拉菜单 2.2.1 File下拉菜单 2.2.2 Tools下拉...

    SQL Server游标的使用/关闭/释放/优化小结

    游标打破了这一查询的思考是面向集合的规则,游标使得我们思考方式变为逐行进行,接下来为大家介绍下游标的使用感兴趣的朋友可以参考下哈,希望可以帮助到你

    从入门到精通HTML5——PDF——网盘链接

     1.5 小结 15  1.6 习题 16  第2章 HTML文件基本标记 17  教学录像:44分钟  2.1 HTML头部标记 18  2.2 标题标记<title> 18  2.3 元信息标记<meta> 19  2.3.1 设置页面关键字 19  2.3.2 设置...

    PFCVAD系统靶负压对硅基ZnO薄膜结构及应变的影响 (2009年)

    采用磁过滤阴极脉冲真空弧沉积(pulsed filtered cathodic vacuum arc deposition ,PFCVAD)系统 ,以Si(100)单晶片为衬底 ,在衬底温度 300℃、氧气压力 4.0×10-2Pa的条件下制备出了 c轴择优取向的 ZnO薄膜。...

    C语言通用范例开发金典.part2.rar

    1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 ...

    C语言通用范例开发金典.part1.rar

    1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 ...

    C 开发金典

    1.8 本章小结 395 第2章 数值计算 397 2.1 常见的数学函数 398 2.1.1 求整数的绝对值 398 范例2-1 求整数的绝对值 398 ∷相关函数:abs函数 2.1.2 求长整型整数的绝对值 399 范例2-2 求长整型整数的绝对值 ...

    WinRAR_4.0.exe

    包含两个掩码,并且所有文件既匹配第一个掩码,也匹配第二个掩码, 较小的子集 或者更精确的匹配拥有更高的优先权。例如,如果你用 *.cpp 和 f*.cpp 掩码, f*.cpp 拥有更高的优先权。 RAR 命令行语法 ~~~~~~...

    arcgis工具

    29.Select by location小结 按位置查找要素的方法 使用按位置选择(Select By Location) 对话框,可以根据要素间的相对空间位置进行查找。可以使用多种方法,查找在同一图层中或不同图层间相互邻近或叠置的点、...

    rar压缩软件.rar

    包含两个掩码,并且所有文件既匹配第一个掩码,也匹配第二个掩码, 较小的子集 或者更精确的匹配拥有更高的优先权。例如,如果你用 *.cpp 和 f*.cpp 掩码, f*.cpp 拥有更高的优先权。 RAR 命令行语法 ~~~~~~...

    protel2004封装

    小结:PCB使用技巧 1、元器件标号自动产生或已有的元器件标号取消重来 Tools工具|Annotate…注释 All Part:为所有元器件产生标号 Reset Designators:撤除所有元器件标号 2、单面板设置: Design设计|...

    万能游戏资源提取软件

    搜索支持模糊查找、区分大小写和正则表达式,正则表达式的具体定义参见附录3 三、导出(支持bmp、jpg、png和mng格式,mng格式的说明参见附录2。另外支持导出为三国群英传的SHP格式) RPGViewer提供三种导出功能: 1...

Global site tag (gtag.js) - Google Analytics