了解仪器进行内存泄漏检查 - iPhone

时间:2009-08-25 16:51:15

标签: iphone memory-leaks instruments

alt text

以上给出的图片是我的应用程序泄漏。

在这里,我想了解一下,在扩展细节中,你可以看到不同的颜色,如浅绿色,浅粉色,浅棕色,浅紫色。

每种颜色表示什么?

现在另一个困惑是“如何找到造成内存泄漏的代码?”

高达内存泄漏的限制 - 实际的iPhone可以继续使用。 (假设10个字节没问题,20个字节没问题,200个字节有问题)

  • 每种颜色表示什么?
  • 哪种颜色表示我们的代码/从哪个细节我们可以获得分配对象的代码&忘记解除它了吗?

(例如 - 详细点击UIKit第二单元格 - 我们无法获取代码)

  • 为什么我们必须解决所有泄漏? - 即使是一次泄密也可以阻塞iPhone?
  • 为什么iPhone允许泄漏留在内存中? /为什么在终止申请后没有自动完成垃圾收集?
  • 如果我尝试释放应根据乐器解除分配的对象,我的应用程序会异常终止。如果我没有dealloc,我的应用程序运行完美,怎么样?
  • 为什么建议您在视图中等待最多10秒或更长时间,如果有泄漏,仪器会检测到泄漏?

5 个答案:

答案 0 :(得分:14)

忽略颜色,其中[DashBoard viewDidLoad]是泄漏的来源,它是如何初始化URLConnection的(在连接完成时你可能没有释放它?)

现在回答你的其他问题:

  • 为什么我们必须解决所有泄漏? - 即使是一次泄漏也会堵塞 iPhone?

是。部分原因不仅在于你只是内存耗尽,而且因为整个手机只有很多内存可供使用,看门狗应用程序会不断监视你的应用程序,如果看到内存使用,它会提前关闭它只有不断增长...

  • 为什么iPhone允许泄漏 在记忆中? /为什么垃圾收集 不是自动完成的 终止申请?

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

  • 如果我尝试释放那些对象 应根据要求解除分配 仪器,我的应用 异常终止。如果我不这样做 dealloc,我的应用程序运行 完美,怎么样?

在这里我无法帮助,你真的需要阅读更多有关保留/释放内存周期的内容...如果你发布一个保留计数为0的对象,应用程序崩溃,因为对象已经消失。

  • 为什么建议你等一下 最多10秒或更长时间的视图,如果 有泄漏,泄漏会 由仪器检测?

因为乐器每隔一段时间就会对内存进行一次采样,所以可能需要一点时间才能让乐器在行动后阅读内存。

答案 1 :(得分:5)

首先,堆栈中的东西是由它们来自哪个库着色的,因此它不包含那么多信息。

其次,我并没有担心iPhone可以承受多少泄漏,而是专注于不泄漏。

要查找泄漏,有几个选项:

  • 在构建项目时使用CLANG static analyzer
  • 手动查找泄漏。您必须始终遵循内存管理规则:如果您allocretaincopy某个对象(包括使用@property (retain)(copy)),必须 releaseautorelease

答案 2 :(得分:3)

颜色代表调用堆栈正在经历的不同库。

泄漏是由代码中进行分配的帧引起的,即使实际分配是在OS库中进行的。仪器正在显示完全泄漏内存的位置。您必须弄清楚代码中的哪一行导致泄漏分配,这将是右侧堆栈中的一个帧。

实际的iPhone没有足够的RAM供您的应用程序使用。对于我的应用程序,我倾向于保守估计大约25MB的RAM。如果代码使用得足够多,任何泄漏,无论多小,都会沉没众所周知的船。

答案 3 :(得分:1)

在堆栈扩展视图中查找您的应用程序名称。内存分配通常最后显示,因此您确切知道哪个库负责内存分配。因此,您应该从代码行向下追溯到结尾。颜色只是更容易跟踪与相同库相关的代码行。相同的库调用将使用相同的颜色着色。

至于追踪泄漏本身。首先通过双击扩展视图中的行来进行应用程序调用,并尝试了解确切泄漏的内容。有时您可以用非泄漏替代品替换泄漏的呼叫。例如,我使用一个调用imageNamed从bundle中检索图像,由于内存不足,应用程序不断崩溃。我只是用google搜索图像命名泄漏,并找到了关于如何在我的应用程序中实现图像现金的非常有用的文章。的确,imageNamed API泄漏。有一些API在iphone SDK中泄漏。

此外,尝试检查您如何使用alloc / retain / release等,无论是释放还是自动释放已分配的内存。

祝你的侦探工作顺利。

答案 4 :(得分:0)

我也有仪器泄漏问题。我今天第一次运行我的应用程序使用泄漏并发现了几个泄漏。泄漏不应泄漏,因为它们无法泄漏,除非一些神奇的代码正在执行并提高了我的对象的保留计数。我了解内存管理指南,知道如何使用自动释放池等。但即使是基于空视图的应用程序也包含泄漏,如果我对它进行一些控制。只需点击2-3次左右。继续尝试。我并不了解信息工具试图提供的信息。这些“泄漏”真的是泄漏,还是只是对仪器应用程序可疑的东西?如果一个没有用户代码的空应用程序,只有几个控件放在一个空视图泄漏内存?