Xcode显示内存泄漏,但Instruments不显示

13

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

enter image description here

当我呈现自定义的ViewController时,内存增加了,但是当我将其关闭时,内存并没有下降。

因此,我还使用Instruments的Allocation工具进行了检查,但结果却不同:

enter image description here

正如你所看到的,Instruments显示了当我呈现该ViewController时出现的峰值,但是在它被关闭后,内存使用量会回到先前的水平。

我已经至少检查了15遍我的代码,个人无法找到任何内存泄漏,并且与Instruments一致。我还在所有可能分配的对象中实现了deinit函数,如下所示:

deinit {
  print("Deinnited \(id)")
}

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

可能出了什么问题?我正在使用:

  • iOS 9.0
  • XCode 版本 7.0 (7A220)
  • Swift 2.1

运行和配置文件的模式均为“调试(debug)”。


只是确认一下,你如何解除视图?还有空闲时间吗?我发现仪器倾向于只显示软件方面。它不会显示尚未清理的 RAM。当没有空闲时间时,操作系统无法清理 RAM。你有单例或共享实例用于缓存吗?可能存在强引用循环。尝试将东西设置为弱引用。只是随便提出一些想法... - R Menke
如果您多次重复打开和关闭操作,是否会在Xcode中看到内存消耗增加? - Darko
@Darko 是的,我在 Xcode 中看到了内存消耗上升,但在 Instruments 中没有。 - Mate Hegedus
我的意思是它是否不断上升,直到你遇到崩溃?为此,您必须直接在设备上进行调试。 - Darko
另一个尝试:您在视图控制器上使用闭包吗?它们也是常见的内存泄漏问题。 - Darko
显示剩余5条评论
3个回答

8
这是一个非常令人恼火的Xcode bug,或者从苹果的角度来看,可能是一个功能 :)。我今天遇到了这个问题,以下是解决方法:
  1. 点击你设置方案的应用程序名称(在xcode中停止按钮旁边)

  2. 选择“编辑方案”

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

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

  5. 取消选中“启用回溯记录”(你需要向下滚动才能找到最后一个选项)

缺点是如果你崩溃了,回溯将被禁用。因此,我想你可能根据你想要关注的内容来切换那个开关。
在“profile”方案中,回溯未启用,因此只有在使用调试导航器(运行方案)时才会看到内存泄漏,而不会在instruments(profile方案)中看到。
/Anders.

3

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


2

在使用更多工具后更新之前的文本。

enter image description here

最近在使用Xcode 7.2.1中的Instruments进行一些实验后,我注意到泄漏图表并不总是有效。在杀死Instruments和模拟器的进程后,再次运行...图表出现了。似乎存在间歇性问题,但尚未找到原因。

enter image description here


这对我没有揭示问题。我能够使用泄漏模板进行分析,发现泄漏并没有发生,因为我一路上都通过了泄漏检查。Xcode 7.x内置的内存分析器肯定有些问题。Instruments显示“Persistent Bytes”在应用程序的整个生命周期内保持稳定,而“Total Bytes”继续增长。我猜他们在Xcode中使用了错误的字段,因为该数字非常接近在Instruments中分析时显示的“Total Bytes”值。 - Beltalowda
最近在使用Xcode 7.2.1中的Instruments进行一些实验后,我发现Leaks图表并不总是有效。在终止Instruments和模拟器的进程后,再次运行...图表才出现。似乎存在间歇性问题,尚未找到原因。 - Douglas Frari
@DouglasFrari,你能帮我解决这些泄漏问题吗? - user9137841

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