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

时间:2013-08-02 16:18:57

标签: ios memory-management instruments

我差不多完成了我的应用程序,并且在使用Instruments来优化性能之后,我才提交到应用程序商店。我注意到每当我执行特定操作(从外部服务器更新我的应用程序中的信息)时,我的堆增长大约350 KB。我在stackoverflow和Apple的文档中发现的研究建议执行Heap镜头以找到有问题的代码。但是,它不是将我带到违规代码,而是向我显示内存地址。

有没有办法使用这些信息?或者我应该使用其他工具?我对乐器很新,所以我很感激任何帮助。

我会显示截图,但我的声誉还不够高。

2 个答案:

答案 0 :(得分:1)

从bbum的教程开始:When is a Leak not a Leak?

简短的回答是,没有工具可以告诉您导致泄漏的确切代码行。系统不知道你犯了什么错误。它知道你何时分配了内存,它知道内存还没有被释放,但它无法知道你是否打算释放内存。它特别不知道何时你应该释放内存,因为它无法知道你为什么首先分配它。

使用堆镜头,您可以发现额外的对象是什么,从那里您可以审核如何使用这些对象。

答案 1 :(得分:1)

有几点想法:

  1. 在堆镜头中,不要忘记显示扩展细节( + E 或选择"扩展细节&#34 ;来自仪器最右侧面板中的" View"菜单。

    查看扩展细节时,它会显示堆栈跟踪,您可以双击那里的方法名称(黑色而不是浅灰色),然后您将被带到生成了分配(这显然不是根本问题,但它会告诉你最初分配对象的位置,这是一个可以开始的地方)。

    view extended detail in heapshot analysis

  2. 话虽如此,我通常首先关注标准的分配工具。我在顶部的分配工具时间轴中的选项 -drag突出显示在此执行时间窗口内的分配,然后选择" Call Tree",并且只关注我的代码,我将检查"反向调用树"和"隐藏系统库"框:

    option drag in allocations tool

    对我而言,我发现这是一种更有效的方法,可以识别在该时间窗口内发生的分配,而无需筛选系统分配。

  3. 不要忘记通过Xcode中的静态分析器运行代码( shift + + B 或选择&# 34;分析""产品"菜单)。在开始通过仪器运行应用程序之前,您应该获得一份干净的健康状况。