随着ios5以后,ARC的模式已经成了主流。前面咱们知道ARC会自动帮助开发者去插入retain和release语句。ARC编译器有两个部分,分别为前端编译器和ARC优化器。前端
1. 前端编译器ios
前端编译器会为“拥有的”对象插入相对的release语句。若是对象的全部权修饰符是strong,那么它就是被拥有的。oop
a.若是在某个方法内去建立一个对象,前端编译器会在方法末尾自动插入release语句来销毁它。性能
b.对于类拥有的对象(实例变量/属性)会在dealloc方法里释放。事实上咱们并不须要去写dealloc方法或者调用dealloc方法,ARC会自动帮你完成一切的。此外由ARC的编译器生成的代码甚至比咱们写的release
语句的性能还要好,由于编译器能够作出假设,在ARC中,没有类能够覆盖release方法,也没有调用它的必要。ARC会经过直接使用objc_release来优化调用过程。而对retain也是一样的方法,ARC会调用objc_retain来取代保留消息。优化
2.ARC优化器spa
虽然ARC前端编译器听起来很NB的样子,可是代码中有时仍然会出现几个对retain和release的重复调用。ARC优化器负责移除多余的retain和release语句,确保生成的代码运行速度高于手动引用计数的代码。code
--------------------------------------------------------------------- 分割线 ---------------------------------------------------------------对象
前面说的是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.get
对于每一个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标识