代码之家  ›  专栏  ›  技术社区  ›  daihovey

ARC委派内存管理

  •  2
  • daihovey  · 技术社区  · 11 年前

    在苹果的文档中,它说

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

    这是否包括UIKit和Framework委托,例如 UIPageViewController 有代理人 UIPageViewControllerDelegate -这必须在dealloc中被否定吗?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Jasper Blues    11 年前

    当父控制器和它的视图之间存在关系时,其中父控制器充当视图代理,其中一个关系不能保留另一个,否则将出现保留循环和内存泄漏。

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

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

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

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

    总结

    • 不,如果使用弱引用,则不需要手动将其清零。通过强引用的保留循环来检查你是否有记忆。
    • 只有在必要的情况下才使用__unsaf_unreaded(又名“assign”)。
    • 同样的规则适用于UIKit和框架类。好的是他们非常一致。

    使现代化

    • 纠正我不可靠的评论:如果你的代表离开了 之前 控制器会这样做,那么您需要手动将其从控制器上清零-谢谢@borrden。