【问题标题】:How to avoid memory leaks with child viewControllers如何避免子视图控制器的内存泄漏
【发布时间】:2018-02-05 19:03:49
【问题描述】:

想象一个由多个子 ViewController 组成的 ViewController,如下所示:

ViewController1:
- ViewController2
- ViewController3

ViewController2 不会更改,因此它是在 Storyboard 上使用 containerViews 定义的。为了通过 ViewController1 获得 ViewController2 的引用,我执行以下操作:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destination = segue.destination
        if let viewController2 = destination as? ViewController2 {
            self.viewController2 = viewController2
        }
   }

至于 ViewController3,它是动态的,所以它以编程方式添加到 ViewController1 中,如下所示:

    addChildViewController(viewController3)
    view.addSubview(viewController3.view)
    viewController3.didMove(toParentViewController: self)

我的问题是,对于这两种情况,处理 viewController2 和 viewController3 引用的内存管理的正确方法是什么。它们应该是弱引用还是强引用?

谢谢!

【问题讨论】:

  • 只要VC2和VC3对VC1没有强引用,就没有引用循环。与其担心不存在的问题,不如验证您是否真的有问题。使用 Instruments 或验证 deinit 是否被调用。一旦您遇到实际问题,请发布具有相关细节的问题。
  • 你为什么在这个问题之后 9 分钟发布关于内存泄漏的第二个问题? stackoverflow.com/questions/48629539/…
  • 当您执行addChildViewController(或将其作为嵌入式容器)时,会保持对子控制器的强引用。所以你不必担心保持自己对它的强引用。但如果你愿意,你可以。但是这里没有强引用循环。

标签: ios swift memory-management memory-leaks childviewcontroller


【解决方案1】:

基本的经验法则是让所有“向外”方向的引用都是强引用,而“向后”引用是弱引用。

在您的情况下, ViewController1 是基本视图控制器。它拥有 ViewController2 和 ViewController3,所以这些引用应该很强大。 ViewController2 和 ViewController3 将 back 指向视图控制器 1,因此它们的引用应该是弱的。

将您的对象图想象成一棵树。它锚定在根的 UIApplication 上,一切都锚定在它上面。树上较高的对象应由其根对象拥有,但不应拥有对其根对象的引用。

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2015-08-27
    • 2018-04-08
    • 2013-06-24
    相关资源
    最近更新 更多