先来看一段ARC代码

objB = objA;
objC = objA;

经过两个赋值后,会发现objA的对象引用+2了,很神奇吧,仅仅只是一个赋值语句,就能把objA对象的引用+2;一向自认为c基础扎实的我,认为有点不可思议,甚至有时会认为此处引用根本没有增加,但没有增加的说法似乎又不同,于是Google下,发现这是编译器在搞鬼,这一点是没有想到的. 此处终于理解了“ARC是编译器特性,而不是运行时特性”;既然知道了是编译器在搞鬼,那么我来简单地模拟下编译器的工作流程.

确认代码是否处于ARC模式 -> 当有对象赋值时,会根据相应变量的特性(weak、strong...)进行相应的代码修改

针对上述代码:(这里假设strong类型),经过编译器转换后,代码如下:

objB = [objA retain]
objC = [objA retain]

理解了上述原因,我们就大致理解了ARC的奥妙,当然ARC模式也有些坑,特别是针对block,详见我的另一篇文章《ObjC之Block解读