ARC委托内存管理

时间:2013-09-27 01:38:57

标签: ios objective-c memory-management delegates automatic-ref-counting

在Apple的文档中,它说

  

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

这是否包括UIKit和Framework委托,例如,UIPageViewController的父级具有委托UIPageViewControllerDelegate - 这是否必须在dealloc中填充?

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

<强>摘要

  • 如果您使用弱引用,则不需要手动将其取消。通过强引用的保留周期检查您是否没有内存。
  • 如果你真的需要,只使用__unsafe_unretained(又名'assign')。
  • 同样的规则适用于UIKit和框架类。好消息是它们非常一致。

<强>更新

  • 纠正我狡猾的评论:如果你的代表在控制器执行 之前离开了,那么你需要手动将它从控制器上取下来 - 感谢@borrden。