在Apple的文档中它说
如果您需要管理资源而不是释放实例变量,您可以实现一个 dealloc 方法。您不必(实际上您不能)释放实例变量,但您可能需要在系统类和其他未使用 ARC 编译的代码上调用 [systemClassInstance setDelegate:nil]。
这是否包括 UIKit 和框架委托,例如,a 的父级 UIPageViewController
有委托UIPageViewControllerDelegate
- 这是否必须在 dealloc 中被取消?
在Apple的文档中它说
如果您需要管理资源而不是释放实例变量,您可以实现一个 dealloc 方法。您不必(实际上您不能)释放实例变量,但您可能需要在系统类和其他未使用 ARC 编译的代码上调用 [systemClassInstance setDelegate:nil]。
这是否包括 UIKit 和框架委托,例如,a 的父级 UIPageViewController
有委托UIPageViewControllerDelegate
- 这是否必须在 dealloc 中被取消?
当父控制器与其视图之间存在关系时,父控制器充当视图委托,其中一个关系不能保留另一个,否则您将有一个保留周期和内存泄漏。
有两种方法可以做到这一点:
首先是将委托标记为 __unsafe_unretained。如果您这样做,您将需要手动清除控制器的 dealloc 中的引用。
二是使用弱引用。大多数 ARC 发生在编译时。这有助于通过减少垃圾收集器可能发生的 CPU 周期来节省电池消耗。然而,对于弱引用,有一个运行时进程维护这些变量的映射,观察它们,并根据需要将它们消除。这就是为什么弱引用需要 iOS5.1 - 它不仅仅是一个编译器功能。
如果使用过多的弱引用,可能会产生性能开销。在实践中,这几乎不会成为一个问题。
概括
更新