我试图了解如何使用Instruments找到内存问题并修复它们。我正在使用Big Nerd Ranch Guide第20章中的项目,为此目的创建了一个人工内存泄漏。
概述项目,(完整源代码位于此github位置https://github.com/smartiothome/BMI)
创建3个类Person,Employee(继承自person)和Assets。 3个类的定义在github项目中。但最重要的一点是
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时,将释放对象。
以下是我运行仪器的步骤。
一个常识Q在谈论我需要帮助的实际问题之前:当程序最终结束时,我可以假设"泄漏的内存中的Employee和Asset对象"将由OS发布?
现在到实际问题我需要帮助
在分配工具下,详细视图
在Category列= Employee的行中,我看到#Persistent column = 8且#Persistent bytes = 384
在Category列= Asset的行中,我看到#Persistent column = 12并且在#Persistent bytes = 384下。再一次,显示的值12与分配和泄漏的Asset对象的总数不匹配(在这种情况下都是10)
在Leaks工具详细视图下,我看到Leaked对象列为6个Asset对象,4个Employee对象,4个Malloc对象和4个NSMUtableArray对象。我希望这可以说泄漏的对象是10个Asset对象和7个Employee对象而没有别的。
因此,我误解了数据仪器正在显示或我使用错误的工具(注意:我第一次运行仪器记录按钮,代码略有不同,这是否会导致任何问题)。任何指针都将非常感激。
答案 0 :(得分:0)
要回答一般性问题,操作系统将在您退出程序时释放泄漏的内存。
您将陷入有关仪器报告的详细信息的困境中。以Leaks仪器的数据为例。当您预计10个泄露的资产对象时,您担心Instruments会报告6个泄露的资产对象。 Instruments报告的泄露资产对象的数量与您泄漏资产对象的事实并不重要。
当Instruments告诉您内存泄漏时,您希望找到内存泄漏的位置,以便修复泄漏。找到泄漏内存的最佳方法是切换到调用树视图。使用跳转条从详细视图切换到调用树视图。切换到调用树视图时,将启用跟踪文档窗口右侧的“调用树”复选框。选择“反转调用树”和“隐藏系统库”复选框可以更轻松地在调用树视图中查找代码,并查找应用程序分配泄漏内存的位置。查找应用程序分配泄漏内存的位置将使您更容易找到内存泄漏源。