【问题标题】:Xcode debug memory graph showing released object显示释放对象的 Xcode 调试内存图
【发布时间】:2017-12-31 12:10:13
【问题描述】:

我一直在为一个项目寻找 Xcode Memory Graph 工具,并注意到一些奇怪的行为。希望有人能够解释发生了什么/如果我需要担心。

我有一个视图控制器,它创建了几个对象(目前它们并没有做太多事情)当我关闭视图控制器确定它们被释放时。但是一个(有时两者)似乎在可视化调试器中徘徊:

只有两个被创建,并且都被取消初始化,在我的控制台中确认:

我认为我的说法是正确的,我不对上图中引用 User 对象的任何对象负责,所以这是一个错误,或者只是我不需要担心的事情?

【问题讨论】:

  • 还有这个问题吗?

标签: ios swift xcode debugging xcode8


【解决方案1】:

我不确定这是否发生在你身上,但这发生在我身上,结果证明这是 Swift 内部内存模型的结果,特别是它如何处理弱引用和无主引用。

为了使这适用于您,某些东西必须对您的 User 对象具有弱或无主引用。

如果是这种情况,当您的对象的最后一个强引用被删除时,该对象将被取消初始化 - 它引用的任何内容都将减少其引用计数并在适当的情况下被释放,并且将运行其 deinit() 方法(如您的日志所示)。但是,它不会被释放

是的,一个对象可以被取消初始化但不能被释放!这样做的原因是,不能允许指向该对象的弱或无主引用指向已释放(或更糟,重新分配)的内存,因为跟随该指针会产生“不安全”行为。因此,这部分内存不能被放弃,因此对象不会被释放。

不过,有两个好消息。首先,只有那个特定的对象被泄露——而不是它引用的任何对象。这意味着只有一小部分内存被泄漏。所以这可能不是什么大问题。其次,对于弱引用,这种行为在 Swift 4 中有所改变(遗憾的是,无主引用仍然会有这种行为)。在 Xcode9 测试版中试用您的项目并查看它是否仍然会发生会很有趣。

这一切都来自于在 WWDC 上提出相同类型的问题。希望它最终适用!

【讨论】:

  • 感谢您富有洞察力的回复。在这种情况下,我认为不会保留任何弱引用或无主引用。实际上,我最后为这个示例创建了一个完全空的项目来复制行为。项目中的所有内容基本上是一个空的User 类和一个ViewController。以这些结果结束。还是谢谢。
【解决方案2】:

如果您不对图中描述的任何对象(即保留用户对象的对象)负责,则不必担心。

仅供参考:我之前在应用中包含 Firebase 时遇到过泄漏。这不是你的错,它不应该泄漏很多内存。

我同意@CharlesSrstka 的观点,如果您仍然担心泄漏,您也可以在仪器上检查它们,它会向您显示可能导致问题的特定代码行。

【讨论】:

  • 将此添加到您的 googleservice-info.plist FIREBASE_ANALYTICS_COLLECTION_ENABLED = NO 它可能会减少泄漏
【解决方案3】:

是否从对象的 deinit 方法记录了“已释放用户”?如果是这样,则对象被取消初始化,因此任何显示的引用都无法使对象保持活动状态。鉴于此,我可能不会担心,但如果您想确定,最好的办法是启动 Instruments,加载分配工具,选择单击运行按钮,然后检查“记录引用计数。”这将使您能够准确地看到保留和释放对象的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 2012-01-25
    • 1970-01-01
    • 2020-01-29
    • 2021-07-20
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多