Xcode调试内存图显示已释放的对象

12

我一直在使用 Xcode 内存图工具查找项目,并注意到一些奇怪的行为。希望有人能够解释发生了什么,或者我是否需要担心。

我有一个视图控制器会创建几个对象(目前没有做太多事情),当我关闭视图控制器时,这些对象确实被释放了。但是其中一个对象(有时两个)似乎仍然在可视化调试器中存在:

图片描述

只有两个对象被创建,并且都已经取消初始化,这在我的控制台中得到了确认:

图片描述

我认为我说得没错,在上面图像中,我不负责任何引用那个 User 对象的对象,所以这是一个bug,还是我不需要担心的事情?


仍然存在这个问题吗? - Marcio Romero Patrnogic
3个回答

2
我不确定这是否是你遇到的问题,但我也曾经遇到过类似情况,原因在于Swift的内部内存模型,特别是它如何处理弱引用和无主引用。
如果这种情况适用于你,那么某个东西必须有一个对你的User对象的弱引用或无主引用。
如果是这样的话,当最后一个指向该对象的强引用被移除时,该对象将被解构 - 它所引用的任何内容都将其引用计数减少并在适当的情况下被释放,并且它的deinit()方法将运行(如你的日志所示)。但是,它将不会被删除
是的,一个对象可以被解构但没有被删除!原因在于指向该对象的弱引用或无主引用不能指向已删除(或更糟的是重新分配)的内存,因为跟随此指针会产生“不安全”的行为。因此,该内存区域不能放弃,因此该对象未被删除。
然而,好消息有两个。首先,只有该特定对象被泄漏 - 它所引用的任何对象都没有被泄漏。这意味着仅泄漏了一小部分内存。因此可能不是什么大问题。其次,对于弱引用,这种行为在Swift 4中已更改(遗憾的是无主引用仍将具有此行为)。有趣的是,在Xcode9 beta中尝试你的项目并查看是否仍然发生。
这都是从WWDC上询问同样类型的问题得出的。希望它适用于你!

感谢您富有见地的回复。在这种情况下,我认为没有持有任何弱引用或未拥有的引用。最终,我创建了一个完全空白的项目来复制此示例的行为。该项目中只有一个基本为空的“User”类和一个“ViewController”。最终得出了这些结果。无论如何,还是非常感谢。 - Kyle Goslan

1
如果您不负责图表中描述的任何对象,这些对象保留了用户对象,那么您不必担心。
FYI:我以前在应用程序中包含Firebase时遇到过泄漏。这不是您的错,它不应该泄漏大量内存。
我同意@CharlesSrstka的观点,如果您仍然担心泄漏,您也可以在Instruments上检查它们,它会显示可能导致问题的特定代码行。

将以下内容添加到您的googleservice-info.plist文件中: FIREBASE_ANALYTICS_COLLECTION_ENABLED = NO 这可能会降低泄漏。 - Marcio Romero Patrnogic

0
从对象的deinit方法中注销了“released user”吗?如果是这样,那么对象已经被解除初始化,因此显示的任何引用都无法保持对象的存活。鉴于此,我可能不会担心它,尽管如果您想确保,最好的方法是启动Instruments,加载分配工具,选项单击运行按钮,并检查“记录引用计数”。这将允许您准确地查看是什么在保留和释放您的对象。

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