Xcode ARC详解全攻略

一、ARC简述

手动管理内存经常忘掉release或autorelease,或者因为release多了、retain少了导致空指针引用程序崩溃,还要经常按COMMAND+SHIFT+B,岂止头疼,简直蛋疼有木有。

虽然objective-c 2.0支持垃圾收集器(Garbage Collection,简称GC),但是垃圾收集器只能在MAC程序上开启,ios上没办法用。就算在MAC应用程序上可以用,GC也会有性能上的损耗。

现在LLVM3.0多了一个给力的新东西,叫Automatic Reference Counting。开启这个选项之后,LLVM会在编译阶段自动帮开发者完成“手动”的内存管理。同时,所有代码中的retain,release和 autorelease会被标记成错误,也就是说,我们完全不需要用以前头蛋俱疼的方式管理内存了。

ARC不仅可以修复错误,还能增强性能。根据WWDC 2011大会的介绍,retain/release快了2.5倍,@autoreleasepool快了6倍,objc_msgSend快了33%。

二、开启ARC后需要遵循的原则

1、不能调用retain/release/autorelease,这些由编译器来完成。

2、结构内不能有对象指针,如果结构中包含,则需要以类代替结构。

3、不能使用id<–>void *的类型转换,因为编译器不知道这个void *是否需要retained。

4、不能使用NSAutoreleasedPool,要用@autoreleasepool {……}来代替。

三、ARC中引入的四个新的关键字

1、Strong Reference,强引用。默认类型,不加任何关键字(也可以写成__strong)。相当于之前代码中的retain属性。

2、Autoreleasing Reference,自动释放引用。通常出现在例如系统error处理函数中(关键字__autoreleasing),描述out-parameters用,只保存在栈中,不太常用。

3、Unsafe Reference,不安全引用。类似于之前代码中的assign属性,不分配内存(关键字__unsafe_unretained),相当于起了个别名。

4、Weak Reference,弱引用。前面提到过,不增加计数,当对象开始释放时,立刻设置成nil。

四、ARC中循环引用造成内存泄露的原因与解决办法

ARC通过记录指向某对象的指针数量来判断该对象是否应该被释放(0代表可以释放)。因而如果出现循环引用,就会出现内存泄露。如下图所示。

Xcode ARC详解全攻略_第1张图片 取消3->2的引用  Xcode ARC详解全攻略_第2张图片 导致泄露。

ARC的解决办法也和简单,使用弱引用(weak reference)。弱引用的申明方式举例如下:

id __weak P;

@property (weak) NSVIew *V;

还是以上面的例子做对比,结果如下:

Xcode ARC详解全攻略_第3张图片 弱引用不增加计数,Xcode ARC详解全攻略_第4张图片 从而消除leak。

五、Instruments的Leaks的新功能

Xcode ARC详解全攻略_第5张图片

这张图里面就标识出了整个leak cycle的全景图。点击cycle graph中的红色箭头,就会自动跳到code中对应的变量声明处,根据情况加上weak关键字就解决leak了。

在新旧技术更替的更年期应注意:现在ARC还under NDA,没有任何开源框架可以公开支持ARC的,如果想使用此特性,在选取开源框架时应该尽量选择使用CF库较少的框架,否则手动爆开源框架的菊花会很痛苦。


你可能感兴趣的:(ios,arc)