Xcode Instruments中的Allocations / leaks工具显示的信息显示不正确

时间:2014-12-29 00:51:19

标签: ios objective-c memory-leaks xcode-instruments

我试图了解如何使用Instruments找到内存问题并修复它们。我正在使用Big Nerd Ranch Guide第20章中的项目,为此目的创建了一个人工内存泄漏。

概述项目,(完整源代码位于此github位置https://github.com/smartiothome/BMI

创建3个类Person,Employee(继承自person)和Assets。 3个类的定义在github项目中。但最重要的一点是

  • Employee类有一个实例变量,指向已分配给该员工的Assets对象,并且
  • Assets类有一个实例变量,该变量指向已分配Asset对象的Employee
  • 当从Assets对象到其Employee对象的指针未标记为弱时,此循环关系会导致内存泄漏

main.m中的代码摘要:基本上,它创建了一个带有10个元素的NSMutableARrays,称为 employees ,它有10个Employee对象然后创建10个Asset对象并随机分配给它们10个Employee对象(因此,一些Employee对象指向0个Asset对象,一些指向1,一些指向2个资产对象)

在此之后,employees数组设置为nill。未分配已分配Asset对象(以及所有Asset对象)的Employee对象,因为引用计数为1,因为" strong"资产对象之间的链接回到"员工"宾语。 (注意:您将在控制台输出中清楚地看到所有这些,因为dealloc方法已被NSLog覆盖。)当Asset类中指向持有它的Employee对象的实例变量设置为弱时,所有Employee和Asset当employees数组设置为nill时,将释放对象。

以下是我运行仪器的步骤。

  1. 我用" Allocations"启动仪器。和"泄漏"工具并按下录制按钮。
  2. 然后我运行程序。
  3. 程序最后有30秒睡眠,因此不会立即结束。
  4. 一个常识Q在谈论我需要帮助的实际问题之前:当程序最终结束时,我可以假设"泄漏的内存中的Employee和Asset对象"将由OS发布?

    现在到实际问题我需要帮助

    1. 在分配工具下,详细视图

      • 在Category列= Employee的行中,我看到#Persistent column = 8且#Persistent bytes = 384

        • 显示的值8与分配的员工对象总数(10)或泄漏的员工对象数量(7)不匹配(因为3个Emplyee对象没有链接到它们的资产,它们被正确释放)
      • 在Category列= Asset的行中,我看到#Persistent column = 12并且在#Persistent bytes = 384下。再一次,显示的值12与分配和泄漏的Asset对象的总数不匹配(在这种情况下都是10)

    2. 在Leaks工具详细视图下,我看到Leaked对象列为6个Asset对象,4个Employee对象,4个Malloc对象和4个NSMUtableArray对象。我希望这可以说泄漏的对象是10个Asset对象和7个Employee对象而没有别的。

    3. 因此,我误解了数据仪器正在显示或我使用错误的工具(注意:我第一次运行仪器记录按钮,代码略有不同,这是否会导致任何问题)。任何指针都将非常感激。

1 个答案:

答案 0 :(得分:0)

要回答一般性问题,操作系统将在您退出程序时释放泄漏的内存。

您将陷入有关仪器报告的详细信息的困境中。以Leaks仪器的数据为例。当您预计10个泄露的资产对象时,您担心Instruments会报告6个泄露的资产对象。 Instruments报告的泄露资产对象的数量与您泄漏资产对象的事实并不重要。

当Instruments告诉您内存泄漏时,您希望找到内存泄漏的位置,以便修复泄漏。找到泄漏内存的最佳方法是切换到调用树视图。使用跳转条从详细视图切换到调用树视图。切换到调用树视图时,将启用跟踪文档窗口右侧的“调用树”复选框。选择“反转调用树”和“隐藏系统库”复选框可以更轻松地在调用树视图中查找代码,并查找应用程序分配泄漏内存的位置。查找应用程序分配泄漏内存的位置将使您更容易找到内存泄漏源。