使用堆分析显示内存地址,而不是代码行。 如何确定导致堆增长的原因?

我几乎完成了我的应用程序,我使用仪器优化性能之前,我提交到应用程序商店。 我注意到,每当我执行一个特定的动作(从外部服务器更新我的应用程序中的信息),我的堆增长了大约350 KB。 我在这里find的关于stackoverflow和苹果文档的研究表明,执行Heap Shot来find有问题的代码。 然而,而不是带我去违规的代码,它显示我的内存地址。

有没有办法使用这些信息? 或者我应该使用另一种工具? 我很新的仪器,所以我感谢任何帮助。

我会显示一个截图,但我的名声还不够高。

一些想法:

  1. 在堆内,不要忘记显示扩展的细节( + E或从“查看”菜单中select“扩展细节”)在仪器的最右侧面板中。

    当查看扩展细节时,它会显示一个堆栈轨迹,你可以在那里双击你的方法名(它将是黑色的,而不是浅灰色的),你会被带到产生分配的线显然没有必要的根本问题,但它会告诉你在哪里对象最初分配,这是一个地方开始)。

    查看堆积分析中的扩展细节

  2. 话虽如此,我通常首先关注标准的Allocations工具。 我会select -drag在顶部的分配工具时间线上突出显示在这个执行时间窗口内的分配,然后我select“调用树”,只关注我的代码,我将检查“Invert Call树“和”隐藏系统库“框:

    选项拖动分配工具

    对我而言,我发现这是一种更有效的方法,可以在不超过系统分配的情况下,确定在这个时间窗口内发生的分配。

  3. 不要忘记在Xcode中通过静态分析器运行代码( shift + + B或在“Product”菜单中select“Analyze”)。 在开始通过乐器运行应用程序之前,您应该获得一份干净的健康法案。

从bbum的教程开始: 什么时候泄漏不是泄漏?

简单的答案是,没有工具会告诉你导致泄漏的确切代码行。 系统不知道你犯了什么错误。 它知道你什么时候分配内存,它知道内存还没有被释放,但是它没有办法知道你是否意味着释放内存。 它特别不知道你什么时候应该释放内存,因为它无法知道你为什么首先分配内存。

使用堆镜头,您可以发现多余的对象,从那里你可以审计你如何使用这些对象。