Xcode 显示内存泄漏,但 Instruments 没有

Posted

技术标签:

【中文标题】Xcode 显示内存泄漏,但 Instruments 没有【英文标题】:Xcode shows memory leak, but Instruments does not 【发布时间】:2016-01-10 07:19:07 【问题描述】:

当我从 Xcode 运行我的应用程序时,很明显我有内存泄漏:

当我展示一个自定义 ViewController 时,内存会增加,但当我关闭它时,它并没有回落。

所以我也使用 Instruments 的 Allocation 工具进行了检查,但这讲述了一个不同的故事:

如您所见,当我展示 ViewController 时,Instruments 会显示峰值,但当它被关闭时,内存使用量会回落到之前的水平。

我已经检查了我的代码至少 15 次,我个人没有发现任何内存泄漏,因此同意 Instruments。我还在我的所有对象中实现了deinit 函数,这些对象会像这样分配:

deinit 
  print("Deinnited \(id)")

所有对象都按预期打印到控制台。

会发生什么?我正在使用:

ios 9.0 XCode 版本 7.0 (7A220) 斯威夫特 2.1

Run 和 Profile 的模式都在“调试”中

【问题讨论】:

只是检查,但您如何消除这些意见?还有空闲时间吗?我发现仪器往往只显示软件方面。它不会向您显示尚未清理的 ram。当没有空闲时间时,操作系统无法清理内存。你有单身人士吗?或用于兑现的共享实例?可能是一个强大的参考周期。尝试将东西设置为弱。只是到处乱想...... 如果你多次重复打开关闭,你会发现 Xcode 中的内存消耗在增加吗? @Darko 是的。我在 Xcode 中看到内存消耗在增加,但在仪器中没有看到 我的意思是它会不断上升,直到你经历崩溃?为此,您必须直接在设备上进行调试。 @Menke 我在父视图控制器上使用了dismissViewController。我对所有代表都使用弱引用。我没有单身人士。我已多次检查我的代码,但找不到任何强引用循环。 【参考方案1】:

经过对 Google 和其他论坛的大量研究,这似乎是 XCode 的一个错误。

【讨论】:

【参考方案2】:

在获得更多工具使用经验后更新之前的文字。

在最近使用 Xcode 7.2.1 中的 Instruments 进行了一些实验后,我注意到泄漏图表并不总是有效。杀掉 Instruments 和模拟器的进程后,再次运行……图表出现了。好像是间歇性的问题,还没找到原因。

【讨论】:

这对我来说并没有揭示问题。我能够使用泄漏配置文件模板进行配置,并且我发现泄漏没有发生,因为我继续进行泄漏检查,每次都通过。 Xcode 7.x 的内置内存分析器肯定有问题。 Instruments 显示“Persistent Bytes”在应用程序的整个生命周期内保持稳定,而“Total Bytes”继续增长。我的猜测是他们在 Xcode 中使用了错误的字段,因为该数字非常接近在 Instruments 中进行分析时显示的“总字节数”值。 最近在 Xcode 7.2.1 中使用 Instruments 进行了一些实验后,我注意到泄漏图表并不总是有效。杀掉 Instruments 和模拟器的进程后,再次运行……图表出现了。似乎有间歇性问题,尚未找到原因。 @DouglasFrari 你能帮我解决这些问题吗?【参考方案3】:

如果您从 Apple 的角度来看,这是一个非常烦人的 Xcode 错误或者可能是一个特性 :)。

我今天确实遇到了,这里是如何解决它。

    按您设置方案的应用程序名称(在 xcode 中的停止按钮旁边)

    选择“编辑方案”

    选择“运行”(弹出窗口左侧)

    选择“选项”(弹出窗口的顶部)

    取消选中“启用回溯记录”(您需要向下滚动的最后一个选择)

不利的一面是,如果您崩溃,回溯将被禁用。所以我猜你想根据你想要关注的内容来切换那个开关。

在“配置文件”方案中,未启用回溯,因此您只在使用调试导航器(运行方案)时看到内存泄漏,而不是在仪器(配置文件方案)中。

/安德斯。

【讨论】:

以上是关于Xcode 显示内存泄漏,但 Instruments 没有的主要内容,如果未能解决你的问题,请参考以下文章

HeapShot 使用 Instrument 检测内存泄漏

检测错误及其解决方案 - Xcode 4.2 - Instrument [Memory Leaks]

Xcode 显示内存泄漏,但 Instruments 没有

iOS:Xcode 4.2:Leaks Instrument 说我的 NSMutableArray 和 NSMutableDictionary 有泄漏,但我看不到在哪里

iPhone 比 Instrument 工具的内存泄漏检查工具速度快吗?

Leaks Instrument (iOS) 发现内存泄漏