随着ios5之后,ARC的模式已经成了主流。前面我们知道ARC会自动帮助开发者去插入retain和release语句。ARC编译器有两个部分,分别为前端编译器和ARC优化器。
1. 前端编译器
前端编译器会为“拥有的”对象插入相对的release语句。如果对象的所有权修饰符是strong,那么它就是被拥有的。
a.如果在某个方法内去创建一个对象,前端编译器会在方法末尾自动插入release语句来销毁它。
b.对于类拥有的对象(实例变量/属性)会在dealloc方法里释放。事实上我们并不需要去写dealloc方法或者调用dealloc方法,ARC会自动帮你完成一切的。此外由ARC的编译器生成的代码甚至比我们写的release
语句的性能还要好,因为编译器可以做出假设,在ARC中,没有类可以覆盖release方法,也没有调用它的必要。ARC会通过直接使用objc_release来优化调用过程。而对retain也是同样的方法,ARC会调用objc_retain来取代保留消息。
2.ARC优化器
虽然ARC前端编译器听起来很NB的样子,但是代码中有时仍然会出现几个对retain和release的重复调用。ARC优化器负责移除多余的retain和release语句,确保生成的代码运行速度高于手动引用计数的代码。
--------------------------------------------------------------------- 分割线 ---------------------------------------------------------------
前面说的是ARC的原理,下面我们看自动释放的对象具体到什么时候释放?(真正的释放机制)
The autoreleased objects will be deallocated when, the closest enclosing autorelease pool on the stack of the thread on which the -autorelease message has been sent, gets drained or released.
对于每个Runloop,系统都会隐式去创建一个Autorelease pool,这样所有的release pool会构成一个类似于CallStack一样的栈式结构,在每一个Runloop结束时候,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个object都会被release。
在起用ARC的项目中,添加不需要使用ARC的文件,在compiler flags中加-fno-objc-arc标识
在未起用ARC的项目中,添加需要使用ARC的文件,在compiler flags中加-fobjc-arc标识