从父视图控制器中移除后仍保留子视图控制器

3
在一个目标为iOS 12的Swift项目中,我有一个子视图控制器,在从其父控制器中移除(以及从.superview中移除其视图)后仍然被保留。
Xcode的内存调试器显示了这个问题:
所选对象(IAIARViewController)是意外被保留的对象。我认为,黑色的线/箭头表示强引用,而浅灰色的线(例如来自SCNRenderer)表示弱引用,这暗示着保留实例的罪魁祸首是ViewController的_childViewControllers NSMutableArray存储。
然而,当我打印NSMutableArray的描述(在最接近IAIARViewController实例的那个数组)时,我得到的是:
Printing description of $20:
<__NSArrayM 0x112e12370>(
    <***.IAIChartViewController: 0x113226400>,
    <***.IAIMapViewController: 0x113093400>
)
即没有IAIARViewController的实例在数组中(而且内容如我所预期)。

这似乎是来自Xcode内存图调试器的错误信息。还有什么可能会导致IAIARViewController被保留?

最初的回答:

根据您提供的信息,Xcode Memory Graph Debugger中的信息可能存在误导性。除了数组之外,还有其他原因可能导致IAIARViewController被保留。


你可以打开malloc调试并运行应用程序来记录保留和释放操作,并在内存图中查看它们。还要检查是否有内存泄漏。 - undefined
谢谢Matt - mallocs看起来和预期的一样(只有一个实例),在Memory Graph Debugger或Instruments中都没有泄漏。我怀疑现在使用的是Storyboard或者SceneKit在多个视图控制器中。根据顺序不同,有时我会看到一个实例被_externalObjectsTableViewForLoading(一个内部UIViewController属性)或者C3DEnginePipeline(SceneKit/Metal内部的东西)所保留。 - undefined
你有没有找到这个问题的解决方案,因为我也遇到了同样的问题。@StephenT - undefined
1个回答

0

你可以尝试逐个注释掉控制器的属性(变量),看看它们是否仍然被保留。我认为问题可能出在这些属性中的一个上。

另外,要检查内存泄漏,你可以使用工具(查看截图)。它可以提供更详细的信息。enter image description here


谢谢Nik - 你指的是哪个视图控制器,为什么你认为属性变量可能是问题所在? - undefined
我建议,保留的视图控制器的某个属性会导致循环引用。 - undefined
好的 - 我在内存图调试器(或Instruments/Leaks)中没有看到任何暗示它是泄漏(没有感叹号)或保留循环(没有显示循环)的东西。可以说,更像是一个无法解释的保留。我会继续深入研究! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接