ARC是编译器的一个功能,与支持代码静态分析的机制一样,当开发者编译应用程序时,编译器将检查Objective-C对象指针(也叫引用)的用法,然后按照retain计数的规则,进行retain计数、释放和自动释放的检查,确保对象在需要的时候能够正确存在,在不需要时重新分配。

  在使用ARC后进行retain、release和autorelease将产生错误。在ARC 的帮助下,程序员可以不用关注对象的retain计数,而将更多的关注点放在这些对象的关系上。对象之间的关系就是引用(其实就是对象指针)

  两种类型的引用:强引用和弱引用

    1.强引用

    默认情况下都是强引用。假如一个对象被分配为强引用,ARC则认为该对象就在附近,并且retain也是隐式的。假如将引用改变为一个新的值,旧的对象被释放,新的对象被retain。

  2.弱引用

    弱引用于旧的手动引用计数指针相似:没有隐式的retain,指针值只在内存在修改。然而这样的引用一直是引起程序崩溃的原因。假如指针没有被retain,这个对象就被重新分配,那么将留下一个坏指针,在以后使用时就是一个潜在的引起崩溃的原因。ARC解决这个问题的方法是指针指向的对象被重新分配时,自动将弱引用设为nil,这就是所谓的“zeroing weak reference”.弱引用一般用来解决retain循环的问题。

注意:只有使用ARC编译的类才可以对其设置弱引用,如果需要对一个弱引用变量赋值,但这个类不支持弱引用的话,程序将抛出异常。因此,可使用__unsafe_unretained修饰符来代替__weak修饰符。

  ARC补充知识

    使用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方法。