ARC机制
2016-02-22 15:00
141 查看
1 Automatic Reference Counting,自动引用计数
ARC只是相对于MRC(Manual Reference Counting或称为非ARC),是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC)。
2ARC基本规则
retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用
3ARC的修饰符
ARC主要提供了4种修饰符,他们分别是:__strong,__weak,__autoreleasing,__unsafe_unretained。
__strong
表示引用为强引用。对应在定义property时的”strong”。所有对象只有当没有任何一个强引用指向时,才会被释放。
注意:如果在声明引用时不加修饰符,那么引用将默认是强引用。当需要释放强引用指向的对象时,需要将强引用置nil。
__weak
表示引用为弱引用。对应在定义property时用的”weak”。弱引用不会影响对象的释放,即只要对象没有任何强引用指向,即使有100个弱引用对象指向也没用,该对象依然会被释放。不过好在,对象在被释放的同时,指向它的弱引用会自动被置nil,这个技术叫zeroing weak pointer。这样有效得防止无效指针、野指针的产生。__weak一般用在delegate关系中防止循环引用或者用来修饰指向由Interface Builder编辑与生成的UI控件。
__autoreleasing
表示在autorelease pool中自动释放对象的引用,和MRC时代autorelease的用法相同。定义property时不能使用这个修饰符,任何一个对象的property都不应该是autorelease型的。
4 ARC使用
1、当myClass.delegate使用weak时,
不会出现互相引用问题,也不会出现crash(引用被释放)问题,
引用关系如下(假设myViewController由Somebody持有):
上图引用关系分析:
第一行:
Somebody创建(持有)myViewController,所以myViewController的引用计数为1。
myViewController持有myClass,所以myClass的引用计数为1。
myClass通过成员delegate引用myViewController,但使用weak弱引用,所以引用计数不受影响。
第二行:
如果Somebody释放myViewController,则myViewController引用计数减1,变成0,此时myViewController自己将会被释放(引用计数是0),并减少所持有对象(myClass)的引用计数。
第三行:
myclass引用计数为0,被释放,由于是delegate是weak属性的,所以delegate将自动被设置为空。
2、当myClass.delegate使用strong时,
会出现相互引用问题,导致对象无法被释放。
引用关系如下:
第一行:
Somebody创建(持有)myViewController,所以myViewController的引用计数为1。
myViewController持有myClass,所以myClass的引用计数为1。
myClass通过成员delegate引用myViewController,但使用strong引用,所以引用计数加1,变成2。
第二行:
如果Somebody释放myViewController,则myViewController引用计数减1,变成1,此时myViewController不会被释放,myclass引用计数为1,也不会被释放,这样就造成了互相引用问题。
而且没有外部对象在引用myViewController或myclass,造成了myViewController和myclass无法被释放。
3、当myClass.delegate使用weak时,如果有另一个Somebody同时持有了myClass,
由于weak可以自动置nil,所以不会出现crash(引用被释放)问题,
则引用关系如下:
第一行:
Somebody创建(持有)myViewController,所以myViewController的引用计数为1。
myViewController持有myClass,所以myClass的引用计数为1。
myClass通过成员delegate引用myViewController,但使用weak弱引用,所以引用计数不受影响。
第二行:
新的Somebody持有同一个myClass,导致myClass引用计数加1,变成2。
第三行:
如果Somebody释放myViewController,则myViewController引用计数减1,变成0,此时myViewController自己将会被释放(引用计数是0),并减少所持有对象(myClass)的引用计数。使myClass引用计数减1,变成1。由于myClass引用myViewController的delegate是weak属性的,所以delegate将自动被设置为空,不会出现crash(引用被释放)问题。
注意,如果myClass引用myViewController的delegate是assign的话,则delegate不会被自动设置为空,将导致delegate再次调用myViewController时出错(myViewController已经释放了)。
第四行:
Somebody正常持有myClass,如果此时Somebody释放myClass,则myClass引用计数减1并释放,不会出现任何问题。
ARC只是相对于MRC(Manual Reference Counting或称为非ARC),是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC)。
2ARC基本规则
retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用
3ARC的修饰符
ARC主要提供了4种修饰符,他们分别是:__strong,__weak,__autoreleasing,__unsafe_unretained。
__strong
表示引用为强引用。对应在定义property时的”strong”。所有对象只有当没有任何一个强引用指向时,才会被释放。
注意:如果在声明引用时不加修饰符,那么引用将默认是强引用。当需要释放强引用指向的对象时,需要将强引用置nil。
__weak
表示引用为弱引用。对应在定义property时用的”weak”。弱引用不会影响对象的释放,即只要对象没有任何强引用指向,即使有100个弱引用对象指向也没用,该对象依然会被释放。不过好在,对象在被释放的同时,指向它的弱引用会自动被置nil,这个技术叫zeroing weak pointer。这样有效得防止无效指针、野指针的产生。__weak一般用在delegate关系中防止循环引用或者用来修饰指向由Interface Builder编辑与生成的UI控件。
__autoreleasing
表示在autorelease pool中自动释放对象的引用,和MRC时代autorelease的用法相同。定义property时不能使用这个修饰符,任何一个对象的property都不应该是autorelease型的。
4 ARC使用
1、当myClass.delegate使用weak时,
不会出现互相引用问题,也不会出现crash(引用被释放)问题,
引用关系如下(假设myViewController由Somebody持有):
上图引用关系分析:
第一行:
Somebody创建(持有)myViewController,所以myViewController的引用计数为1。
myViewController持有myClass,所以myClass的引用计数为1。
myClass通过成员delegate引用myViewController,但使用weak弱引用,所以引用计数不受影响。
第二行:
如果Somebody释放myViewController,则myViewController引用计数减1,变成0,此时myViewController自己将会被释放(引用计数是0),并减少所持有对象(myClass)的引用计数。
第三行:
myclass引用计数为0,被释放,由于是delegate是weak属性的,所以delegate将自动被设置为空。
2、当myClass.delegate使用strong时,
会出现相互引用问题,导致对象无法被释放。
引用关系如下:
第一行:
Somebody创建(持有)myViewController,所以myViewController的引用计数为1。
myViewController持有myClass,所以myClass的引用计数为1。
myClass通过成员delegate引用myViewController,但使用strong引用,所以引用计数加1,变成2。
第二行:
如果Somebody释放myViewController,则myViewController引用计数减1,变成1,此时myViewController不会被释放,myclass引用计数为1,也不会被释放,这样就造成了互相引用问题。
而且没有外部对象在引用myViewController或myclass,造成了myViewController和myclass无法被释放。
3、当myClass.delegate使用weak时,如果有另一个Somebody同时持有了myClass,
由于weak可以自动置nil,所以不会出现crash(引用被释放)问题,
则引用关系如下:
第一行:
Somebody创建(持有)myViewController,所以myViewController的引用计数为1。
myViewController持有myClass,所以myClass的引用计数为1。
myClass通过成员delegate引用myViewController,但使用weak弱引用,所以引用计数不受影响。
第二行:
新的Somebody持有同一个myClass,导致myClass引用计数加1,变成2。
第三行:
如果Somebody释放myViewController,则myViewController引用计数减1,变成0,此时myViewController自己将会被释放(引用计数是0),并减少所持有对象(myClass)的引用计数。使myClass引用计数减1,变成1。由于myClass引用myViewController的delegate是weak属性的,所以delegate将自动被设置为空,不会出现crash(引用被释放)问题。
注意,如果myClass引用myViewController的delegate是assign的话,则delegate不会被自动设置为空,将导致delegate再次调用myViewController时出错(myViewController已经释放了)。
第四行:
Somebody正常持有myClass,如果此时Somebody释放myClass,则myClass引用计数减1并释放,不会出现任何问题。
相关文章推荐
- 脚本游戏之二: 贪吃蛇游戏新版
- mupdf PDF查看器使用教程
- Apollo 配置详细步骤(Windows环境)
- 如何设计一款优秀的软件架构
- Java Web应用中调优线程池的重要性
- CoAP协议学习——CoAP基础
- maven 构建 web项目
- 向MapReduce转换:形成推荐
- httpd配置文件中重写函数Rewrite
- 全面解析Bootstrap布局组件应用
- Linux网络设备phy
- 排序算法总结
- 科大Linux内核分析之实验一
- properties文件的存取与Map键值对排序【按照value进行排序】
- js运算符优先级
- MySQL中备份的几种方式
- 阿里2015 在线笔试
- iOS开发 https协议后获取信息失败
- 禁止网页右键查看源代码
- python学习笔记