2

在Apple的文档中它说

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

这是否包括 UIKit 和框架委托,例如,a 的父级 UIPageViewController有委托UIPageViewControllerDelegate- 这是否必须在 dealloc 中被取消?

4

1 回答 1

2

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

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

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

  • 二是使用弱引用。大多数 ARC 发生在编译时。这有助于通过减少垃圾收集器可能发生的 CPU 周期来节省电池消耗。然而,对于弱引用,有一个运行时进程维护这些变量的映射,观察它们,并根据需要将它们消除。这就是为什么弱引用需要 iOS5.1 - 它不仅仅是一个编译器功能。

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

概括

  • 不,如果您使用弱引用,则不需要手动取消它。通过强引用的保留循环检查您是否没有记忆。
  • 仅在确实需要时才使用 __unsafe_unretained(又名“分配”)。
  • 相同的规则适用于 UIKit 和框架类。好消息是它们非常一致。

更新

  • 更正我狡猾的评论:如果您的代表在控制器之前消失了,那么您将需要手动将其从控制器中清除 - 感谢@borrden。
于 2013-09-27T01:47:28.043 回答