iPhone开发之深入浅出 (4) — ARC之循环参照
?
这种情况下,由于Entry对象被AddrBook强参照,所以不能释放。另一方面,如果Entry被释放了,AddrBook对象的强参照也就没有了,其对象也应被释放。
如图所示,当强参照AddrBook对象的变量被释放的时候,AddrBook对象将被自动释放,同时将失去Entry成员对象的强参照。另外,当AddrBook对象被释放的时候,Entry对象中的AddrBook变量也将由Zeroing机制,自动带入nil。我们不需要担心释放对象的再访问问题。
下面,我们将看看有几种情况下,需要注意循环参照问题。
这里,ViewController对象中强参照detailViewController,如果DetailViewController的delegate不是弱参照ViewController话,将引起循环参照。
另外,当类中使用weak @property声明的delegate变量时,如果参照对象被释放,该变量将被自动设为nil,不需要程序代码设置。
为了解决该问题,我们可以有下面两种选择。
使用__block关键字,让对象有读写权限,如果Block内的处理完毕就释放object。
"block: str=%@", strongObject.str); }};[object performBlock];总上,当我们使用Blocks时,也需要考虑Block中变量和实例的关系,不要引起不必要的循环参照问题。