曾几何时,保持与释放对象是你自己的事情,程序员需要向对象发送retain与release消息。NSObject还实现了retain与release,不过在ARC下(以及在Swift中),你不能再调用它们了。这是因为ARC会替你调用!这是ARC的职责:帮你完成本应该由程序员自己完成的内存管理工作。
ARC是编译器的一部分。编译器会在背后插入retain与release调用来修改你的代码。比如,当通过调用某个方法接收到了一个引用类型的对象时,ARC会立刻保持它,这样在代码运行时对象就会一直存在;当代码执行完毕时,ARC就会释放对象。与之类似,在创建或复制一个引用类型的对象时,ARC会增加其保持计数,当代码执行完毕时会释放它。
ARC很保守,但却非常精确。实际上,ARC会在每个结合处保持计数(可能很多人并没有注意到这里也需要进行内存管理):当接收到对象作为参数时它会保持计数、在将对象赋给变量时它会保持计数,诸如此类。它甚至还会在背后插入临时变量,使其能够尽早指向对象,从而可以保持它。当然,最终它还会释放以与保持相匹配。