ARC委托内存pipe理

在苹果的文件中说

如果您需要pipe理资源,而不是释放实例variables,则可以实施dealloc方法。 您不必(实际上不能)释放实例variables,但是您可能需要在系统类和其他未使用ARC编译的代码上调用[systemClassInstance setDelegate:nil]。

这是否包括UIKit和框架委托,例如,一个UIPageViewController的父母有委托UIPageViewControllerDelegate – 这是否必须在dealloc?

当父控制器和它的视图之间有一个父控制器作为视图委托的关系时,其中一个关系不能保留另一个,否则你将有一个保留周期和一个内存泄漏。

有两种方法可以做到这一点:

  • 首先将代表标记为__unsafe_unretained。 如果你这样做,你将需要手动清除控制器dealloc中的引用。

  • 其次是使用弱参考。 ARC大部分发生在编译时。 这有助于通过减less垃圾收集器可能发生的CPU周期来节省电池消耗。 但是,对于弱引用,有一个运行时进程维护这些variables的映射,观察它们,并根据需要将它们删除。 这就是为什么弱引用需要iOS5.1 – 它不仅仅是一个编译器function。

  • 如果你使用太多的弱引用,这可能是性能开销。 在实践中,这几乎不会成为一个问题。

概要

  • 不,如果您使用弱引用,则不需要手动将其清除。 通过强引用的保留周期检查你是否没有内存。
  • 如果你真的需要的话,只能使用__unsafe_unretained(又名“转让”)。
  • UIKit和框架类也适用相同的规则。 好的是他们非常一致。

更新

  • 纠正我的狡猾的评论:如果你的委托在控制器之前就消失了,那么你需要手动将它从控制器中删除 – 谢谢@borrden。