ARC机制

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并释放,不会出现任何问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值