我很好奇,当一个人继续执行他们的代码以便用仪器进行泄漏检查时 - 是否谨慎地手动点击应用程序的所有部分以确保在相应区域中发生内存泄漏?例如,我相信我的应用程序中有一些内存泄漏,深入UINavigationController树。我是否继续运行应用程序检查泄漏,同时手动向下钻取iPhone以进入应用程序的这一部分?仪器是否足够智能,可以自行找到它?什么是正确的方法?
感谢您的任何见解!
答案 0 :(得分:5)
不,仪器只监控代码的内存分配,它不会“去”任何地方,除非你的应用程序去那里。实际上,泄漏只不过是一段记忆,不再存在参考;因此它不能再被释放,因为如果你甚至不能再参考它,将来如何释放它?
但是,仪器不会发现所有内存泄漏。如果您保留对内存的引用,只是永远不要使用它们来释放内存,仪器不会将其视为泄漏,因为它无法预见您将来是否会将其释放。因为你仍然可以释放它,它不被认为是泄漏。因此,如果您遇到内存问题,不仅要查找泄漏,还要监视应用程序在一段时间内“收集”的内存量,这可能会有所帮助。如果它永久上升,即使它不应该,你可能仍然有泄漏,只有你没有丢失对内存的引用。答案 1 :(得分:1)
通常,我会专注于怀疑导致泄漏的模块,然后扩大范围。虽然我没有在Mac上使用过Instruments,但我使用Purify和本机Windows堆工具在Windows程序中进行内存泄漏跟踪。
在确定了主要泄漏的来源之后,使用不同的测试输入来运行程序并不是一个坏主意,并且通常会检查程序是否存在其他泄漏。即使是具有特定数据集的小泄漏也可能导致更大的泄漏。