繁体   English   中英

导航堆栈中的ViewController在弹出时不会消失,导致内存泄漏

[英]ViewController in navigation stack won't deinit when popped, causing memory leak

在我的应用程序中,我有一个RootViewController ,我的所有ViewControllers都是子类。 开发时,我通常在RootVC中使用它:

deinit { 
    print("\(type(of: self)) deinit")
}

这样我能看到我的任何viewControllers何时出现。 它打印:

MyExampleViewController deinit

今天我注意到当我离开它时,其中一个没有离开。 我们称之为DetailViewController 这是一个完全正常的(Root)ViewController子类,被推入主NavigationController 当点击导航中的Back button时,它会导航,但从不说它会消失。 这是第一个推送控制器,所以我不能在之前弹出控制器,看看是否有帮助。 但是DetailViewController来回导航时,任何控制器都会被推动。

我决定检查内存图,所以我再次运行我的应用程序,推送到DetailViewController ,然后单击导航中的Back button将其弹出,然后单击Debug memory graph

在左侧的调试导航器中,我向下滚动,看到我的DetailViewController存在一个实例。 如果我在打开内存图之前来回移动几次,那么当我推送和弹出时,这个DetailViewController实例就会多。

点击它,我看到这个:

记忆图 DetailViewController是最右侧的单个控制器。 我没有那么多使用Memory Graph ,但我认为“实心”白线是强烈的主张,而稍微更透明(灰色)的线是弱主张。 这意味着我的控制器有一个强烈的主张。 底部的那个。

这是底行: 记忆图2

这是什么意思? 看起来我的(自定义) NavigationController有一个名为_childViewControllers的数组,它保留了我的弹出控制器。 为了澄清,我的自定义NavigationController没有任何存储的变量。 它只是覆盖5个函数的子类,就是全部。 我有大约20个不同的ViewControllers被这个完全相同的自定义`NavigationController推送和弹出,但它们都没有问题。

我读图错了吗? 必须有一个不同的强烈主张,在图表中不可见,对吗? 当我“啪”的viewController通过单击Back ,应该不是我viewController被移除_childViewControllers

终于搞清楚了。 不幸的是,我不得不一点一点地评论几百行代码,直到我发现它何时开始在预期时去掉。 问题是在一个闭包中缺少[weak self] ,并不出乎意料,但它是在一个完全不同的类中,通过复杂的层次结构连接起来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM