当父控制器和它的视图之间存在关系时,其中父控制器充当视图代理,其中一个关系不能保留另一个,否则将出现保留循环和内存泄漏。
有两种方法可以做到这一点:
-
首先是将委托标记为__unsafe_unretained。如果您这样做,您将需要手动清空控制器的解除锁定中的引用。
-
第二种是使用弱引用。大部分ARC发生在编译时。这有助于通过减少垃圾收集器可能发生的CPU周期来节省电池消耗。然而,对于弱引用,有一个运行时进程可以维护这些变量的映射,观察它们,并根据需要将它们否定。这就是为什么弱引用需要iOS5.1——它不仅仅是一个编译器功能。
-
如果使用过多的弱引用,可能会带来性能开销。在实践中,这几乎不会成为一个令人担忧的问题。
总结
-
不,如果使用弱引用,则不需要手动将其清零。通过强引用的保留循环来检查你是否有记忆。
-
只有在必要的情况下才使用__unsaf_unreaded(又名“assign”)。
-
同样的规则适用于UIKit和框架类。好的是他们非常一致。
使现代化
-
纠正我不可靠的评论:如果你的代表离开了
之前
控制器会这样做,那么您需要手动将其从控制器上清零-谢谢@borrden。