noli
2015-02-06 18:20:03 +08:00
要理解ARC,了解一个变量的作用域是很有必要的。
1. 变量 s 的作用域位是 aMethodInAClass 方法“被调用”的期间,执行完方法后方法就退栈了,所以s也会被回收,这种情况是ARC可以在编译期就知道的,所以可以正确插入回收代码。
2. 成员 name 的作用域是 与具体的 Person 对象绑定的。
就是说,只要 Person对象存在,name 就存在,只要Person 对象退出作用域或者说生命周期结束(就是 dealloc 之后),name 也会结束。
没有形成循环引用的前提下,因为 objc 对对象的引用都可以追朔到栈上,所以Person 的生命周期可能的结束点可以肯定,必然不晚于某个函数return 时,也就是跟 s 的情形一样,是可以由编译器操纵引用计数的。所以,对于这种不可能形成循环引用的对象,在 dealloc 里面写不写 nil out 是没有区别的。
但假如 Person 里面有一个 MyFacebook,MyFacebook 里面会引用Person 对象,那么这个时候就有可能形成循环引用。就应该根据条件 在 dealloc 之前(而不是在 dealloc 里面) nil out MyFacebook 类型的变量,避免循环引用。