了解内存泄漏检查工具 - iPhone

6

alt text

上面的图片是我应用程序的泄漏情况。

在“扩展细节”中,您可以看到不同的颜色,如浅绿色、浅粉色、浅棕色和浅紫色。

每种颜色代表什么含义?

现在另一个困惑是“如何定位创建内存泄漏的代码?”

内存泄漏的极限是多少?(例如,10个字节没有问题,20个字节没有问题,200个字节有问题)

  • 每种颜色代表什么含义?
  • 哪种颜色代表我们的代码/从哪个详细信息中我们可以找到分配对象并忘记dealloc它的代码?

(例如-在详细信息中点击UIKit第二个单元格-我们无法获得代码)

  • 为什么我们必须解决所有泄漏?即使一个泄漏也会导致iPhone崩溃?
  • 为什么iPhone允许泄漏保留在内存中?/为什么终止应用程序后自动进行垃圾收集?
  • 如果我尝试dealloc应该根据工具释放的对象,我的应用程序会异常终止。如果我不dealloc,我的应用程序就可以完美运行,为什么?
  • 为什么建议您在视图中等待10秒或更长时间,如果有泄漏,则Instruments将检测到泄漏?
5个回答

14

忽略颜色,这个问题的源头是 [DashBoard viewDidLoad],可能是在初始化一个URLConnection时出了问题(也许连接完成后没有释放?)

现在回答你提出的其他问题:

  • 为什么我们必须解决所有内存泄漏?即使有一个小小的内存泄漏也会阻塞iPhone吗?

是的。原因不仅仅是你会简单地耗尽内存,而且由于整个手机只有那么多内存可供使用,一个看门狗应用程序会不断监视你的应用程序,如果它发现内存使用一直在增长,就会提前关闭它...

  • 为什么iPhone允许内存泄漏?/为什么终止应用程序后自动进行垃圾收集?

当应用程序退出时,所有应用程序内存都将被释放。

  • 如果我试图dealloc对象,但是根据instruments工具,这些对象应该已经被释放了,我的应用程序会异常终止。如果我不dealloc,我的应用程序运行得很好,为什么?

在这里我无法帮助你,你真的需要更多地了解retain/release内存循环...如果你释放一个引用计数为0的对象,应用程序会崩溃,因为该对象已经不存在了。

  • 为什么建议在一个视图中等待10秒或更长时间,如果有内存泄漏,instruments工具会检测到?

因为仪器工具是通过定期对内存进行采样来工作的,所以可能需要一点时间才能读取内存,特别是在操作后。


2
+1 很好的回答 Kendall。@sagar,你应该注意到对于问题3,你永远不应该直接调用dealloc,只能保留或释放(唯一的例外是[super dealloc])。我相信你的解决方案是实现autorelease,因为听起来你的崩溃是由于过早释放对象引起的。例如[[[NSArray alloc] init] autorelease]; - h4xxr

5
首先,堆栈中的内容是按照它们来自哪个库进行着色的,因此它并不包含太多信息。
其次,与其担心iPhone能承受多少泄漏,不如专注于避免它泄漏。
要查找泄漏,有几种选择:
  • 在构建项目时使用CLANG静态分析器
  • 手动查找泄漏。您必须始终遵循内存管理规则:如果您allocretaincopy一个对象(包括使用@property(retain)(copy)),则必须releaseautorelease它。

3

这些颜色代表调用栈经过的不同库。

泄漏是由代码中进行分配的框架引起的,即使实际分配在操作系统库中深处进行。Instruments 正确地显示了泄漏内存的分配位置。你需要找出代码中哪一行导致了泄漏的分配,这将是右侧堆栈中的一个帧。

实际上,iPhone 可以向你的应用程序提供的 RAM 很少。我倾向于保守估计我的应用程序可使用约 25MB RAM。无论多小的泄漏,如果代码被足够使用,都可能使船只沉没。


1
在堆栈扩展视图中查找您的应用程序名称。内存分配通常显示在最后,因此您知道哪个库负责内存分配。因此,您应该从代码出现的行开始向下跟踪,直到结束。颜色只是使跟踪与同一库相关的代码行更容易。相同库调用将以相同的颜色着色。
至于追踪泄漏本身。首先,通过在扩展视图中双击行来转到您的应用程序调用,并尝试了解确切的泄漏情况。有时,您可以使用不泄漏的替代品替换泄漏调用。例如,我使用了一个名为imageNamed的调用来从捆绑包中检索图像,应用程序由于内存短缺而不断崩溃。我只是搜索了imageNamed泄漏并找到了非常有用的文章,介绍了如何在我的应用程序中实现图像缓存。确实,imageNamed API会泄漏。iPhone SDK中有泄漏的API。
此外,请尝试检查您如何使用alloc / retain / release等,无论您是否释放或自动释放已分配的内存。
祝您在侦探工作中好运。

@Nava Carmon - 如果您有那个API泄漏的链接,请在您的答案中放置。谢谢。 - sagarkothari

0
我也遇到了仪器泄漏的问题。今天我第一次使用泄漏检测运行我的应用程序,发现了几个泄漏。这些泄漏不应该是泄漏,因为它们没有泄漏的方式,除非某些神奇的代码正在执行并提高了我的对象的保留计数。我理解内存管理指南,知道如何使用自动释放池等。但即使是一个空的基于视图的应用程序,如果我在上面放置几个控件,甚至只是点击2-3次,也会出现泄漏。请随便试试。我真的不理解仪器试图提供的信息。那些“泄漏”是否真的是泄漏,还是仪器应用程序怀疑的东西?一个没有用户代码,只有几个控件放在空视图上的空应用程序会泄漏内存吗?

我不相信它们是可疑的“事物”。泄漏工具检查应用程序的可写内存、寄存器和堆栈中是否存在对内存块的引用。如果没有,但内存块仍然存在,则该工具将认为缓冲区存在泄漏。 - makstaks
这是在模拟器上还是设备上?我发现在模拟器上检测到的“泄漏”在实际设备上运行时不会出现,所以我不再在模拟器上进行泄漏分析了。 - daver
设备上的泄漏情况有所不同,总体来说较少。我停止了为iPhone开发。 - gyozo kudor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接