6

替代文字

上面给出的图像是我的应用程序泄漏。

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

每种颜色代表什么?

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

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

  • 每种颜色代表什么?
  • 哪种颜色表示我们的代码/从哪个细节我们可以得到我们分配对象并忘记释放它的代码?

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

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

5 回答 5

14

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

现在回答您的其他问题:

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

是的。部分原因不仅是您会简单地用完内存,而且由于整个手机只有这么多内存可以使用,因此看门狗应用程序会不断监视您的应用程序,如果发现内存使用情况会提前关闭它只会不断成长……

  • 为什么 iPhone 允许泄漏保留在内存中?/ 为什么应用程序终止后没有自动完成垃圾收集?

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

  • 如果我尝试根据工具释放应该释放的对象,我的应用程序会异常终止。如果我不解除分配,我的应用程序运行完美,如何?

在这里我无能为力,你真的需要阅读更多关于保留/释放内存周期的信息......如果你释放一个保留计数为 0 的对象,应用程序会因为该对象消失而崩溃。

  • 为什么建议您在视图中等待 10 秒或更长时间,如果有泄漏,仪器会检测到泄漏?

因为仪器通过每隔一段时间对内存进行采样来工作,所以仪器可能需要一点时间才能在一个动作后读取内存。

于 2009-08-25T19:29:05.017 回答
5

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

其次,与其担心 iPhone 会泄漏多少,我会专注于不让它泄漏。

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

  • 构建项目时使用CLANG 静态分析器
  • 手动查找泄漏。您必须始终遵循内存管理规则:如果您alloc,,retaincopy对象(包括使用@property (retain)(copy)),您必须 releaseautorelease它。
于 2009-08-25T16:59:54.803 回答
3

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

泄漏是由代码中进行分配的框架引起的,即使实际分配发生在操作系统库的深处。Instruments 会准确地向您显示泄漏内存的分配位置。您必须弄清楚代码中的哪一行导致了泄漏的分配,这将是右侧堆栈中的帧之一。

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

于 2009-08-25T16:59:19.640 回答
1

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

至于追踪泄漏本身。首先通过双击扩展视图中的行转到您的应用程序调用,并尝试了解究竟是什么泄漏。有时您可以用非泄漏替代品替换泄漏呼叫。例如,我使用调用 imageNamed 从包中检索图像,由于内存不足,应用程序不断崩溃。我刚刚搜索了 imageNamed 泄漏,发现关于如何在我的应用程序中实现图像现金的非常有用的文章。事实上,imageNamed API 泄​​漏了。iphone SDK 中有 API 泄​​漏。

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

祝你侦探工作顺利。

于 2009-08-25T17:25:46.497 回答
0

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

于 2010-06-17T13:31:15.123 回答