首页 > 解决方案 > 从父级删除后保留的子视图控制器

问题描述

在针对 iOS 12 的 Swift 项目中,我有一个子视图控制器,该控制器在从其父级中删除后(以及在其视图从 .superview 中删除后)被保留。

Xcode 的内存调试器显示了这一点:

Xcode 内存调试器截图

右侧的选定对象 (IAIARViewController) 是意外保留的对象。我假设暗线/箭头表示强引用,浅灰色的(例如来自 SCNRenderer)表示弱引用,这意味着保留实例的罪魁祸首是 ViewController 的 _childViewControllers NSMutableArray 存储。

但是,当我打印 NSMutableArray 的描述(链中最接近 IAIARViewController 实例的描述)时,我得到:

Printing description of $20:
<__NSArrayM 0x112e12370>(
    <***.IAIChartViewController: 0x113226400>,
    <***.IAIMapViewController: 0x113093400>
)

即数组中没有 IAIARViewController 的实例(内容是我所期望的。)

这似乎可能是来自 Xcode Memory Graph Debugger 的错误信息。还有什么可能导致 IAIARViewController 被保留?

标签: iosswiftxcodeuiviewcontrollerretain

解决方案


您可以尝试对控制器的属性(vars)一一进行注释,看看它是否仍然被它们保留。我认为问题出在这些属性之一上。

您还可以使用仪器检查泄漏(查看屏幕截图)。它可以为您提供更详细的信息。在此处输入图像描述


推荐阅读