ARC是编译器的一个功能,与支持代码静态分析的机制同样,当开发者编译应用程序时,编译器将检查Objective-C对象指针(也叫引用)的用法,而后按照retain计数的规则,进行retain计数、释放和自动释放的检查,确保对象在须要的时候可以正确存在,在不须要时从新分配。程序员
在使用ARC后进行retain、release和autorelease将产生错误。在ARC 的帮助下,程序员能够不用关注对象的retain计数,而将更多的关注点放在这些对象的关系上。对象之间的关系就是引用(其实就是对象指针)工具
两种类型的引用:强引用和弱引用指针
1.强引用code
默认状况下都是强引用。假如一个对象被分配为强引用,ARC则认为该对象就在附近,而且retain也是隐式的。假如将引用改变为一个新的值,旧的对象被释放,新的对象被retain。对象
2.弱引用内存
弱引用于旧的手动引用计数指针类似:没有隐式的retain,指针值只在内存在修改。然而这样的引用一直是引发程序崩溃的缘由。假如指针没有被retain,这个对象就被从新分配,那么将留下一个坏指针,在之后使用时就是一个潜在的引发崩溃的缘由。ARC解决这个问题的方法是指针指向的对象被从新分配时,自动将弱引用设为nil,这就是所谓的“zeroing weak reference”.弱引用通常用来解决retain循环的问题。开发
注意:只有使用ARC编译的类才能够对其设置弱引用,若是须要对一个弱引用变量赋值,但这个类不支持弱引用的话,程序将抛出异常。所以,可以使用__unsafe_unretained修饰符来代替__weak修饰符。编译器
ARC补充知识it
使用ARC机制的代码无须修改,就能与手动引用计数的代码一块儿使用。事实上,在单个文件基础上才能使用ARC。编译
Xcode提供了从已有代码向ARC机制转换的工具,这个工具在Edit菜单中找到,Refactor->Convert to Objective-C Automatic Reference Counting下
尽管ARC代码能够运行在Mac OS X 10.6和iOS 4上,但这些平台并不支持弱引用的使用
尽管Objective-C在不少状况下能够与C语言一块儿混合使用,可是ARC并不容许C语言结构体包含对象指针
属性命名不能以new开始。
在ARC下,调用retain、release、autorelease或者dealloc(如with [super dealloc])将产生错误,也不能重载retain、release或者autorelease方法。