如何检测 iPhone 应用程序中的内存泄漏/电池耗尽

Posted

技术标签:

【中文标题】如何检测 iPhone 应用程序中的内存泄漏/电池耗尽【英文标题】:How to detect memory leak / battery drain in an iPhone app 【发布时间】:2009-02-12 05:02:54 【问题描述】:

恐怕我在 iPhone 应用程序的 1.2 版中引入了内存泄漏或其他问题。当我使用 1.2 版本时,我注意到我的电池消耗比使用 1.1 版本快很多。相比之下,1.1 版本的电池可以使用一整天,晚上仍然有充足的电量,但 1.2 版本我发现我必须在中午时分插上电源。

内存泄漏(或其中很多)会导致电池消耗增加,还是我有其他问题?

我的应用使用的唯一有趣的东西是 AVAudioPlayer 类来播放一些 caf 音频文件。除此之外,它只是几个带有表格视图的视图。

我确实在 applicationWillTerminate 方法中调用了 AudiosessionSetAcvie(false),所以我认为不是音频会话导致了这种情况。我不必让我的应用程序处于活动状态以耗尽电池电量。使用一段时间然后退出就足够了。所以我很确定我留下了一些东西,我只是不确定是什么。

我尝试使用 Instruments 工具,但您似乎无法与设备上运行的应用一起使用(由于某种原因,我的应用停止在模拟器中运行)

关于如何找出导致电池耗尽的原因的任何想法?

【问题讨论】:

如果您无法让 Instruments 工作,请尝试我在此处提供的答案:***.com/questions/379983/… 感谢您的提示。我现在可以在设备上进行检测 【参考方案1】:

内存泄漏不会导致电池使用量增加。但是,如果内存泄漏持续存在,最终您会收到内存警告,如果您无法清理足够的内存,您的应用程序将被终止。

电池利用率增加通常意味着某些原因导致您的代码继续运行。解决此问题的最佳方法是在 Instruments 下运行您的应用程序(可能使用 Sampler),并让它处于您确信它通常会耗尽电池电量的状态。检查 Sampler 的结果,如果你有代码在运行,你将能够看到它的堆栈跟踪。

希望一旦您找到正在运行的代码,如何停止它就会变得很明显。

【讨论】:

我注意到即使我的应用程序没有运行,电池也会耗尽。那么即使我退出我的应用程序,我的应用程序的某些部分是否可能仍在执行? 我非常怀疑。因此,在退出应用程序后将新启动的手机与新启动的手机进行比较时,您是否注意到电池消耗更快? 对。但我没有任何确凿的证据,只是我的观察。我现在开始认为它与我的应用无关。 但是如果您运行 Sampler,您必须将设备连接到计算机,并且在文档中苹果声明您应该断开设备,进行所需的测试,然后导入能量诊断。但是,如果您将 Sampler 添加到 Energy Instruments 中,您可以导入诊断...关于如何在导入诊断时使用 Sampler 的任何想法?谢谢【参考方案2】:

正如 Nilobject 所说,内存泄漏不会导致电池使用量增加。

我会尝试一次注释掉各个功能区域,以尝试缩小导致问题的区域。在您的情况下,首先要尝试的显然是删除音频。如果在您完成此操作后,电池使用量恢复正常,您就知道该在哪里进行更深入的研究了。

【讨论】:

【参考方案3】:

(由于某种原因,我的应用程序停止在模拟器中运行)

我会修复它并使用工具来修复性能错误。解决困难的缺陷而留下简单的缺陷从来都不是一个好主意。

【讨论】:

我真的不想花时间调试 Apple 的模拟器。该死的东西对我来说从来没有真正奏效过,所以我停止使用它。我在连接 iPhone 的情况下进行开发。

以上是关于如何检测 iPhone 应用程序中的内存泄漏/电池耗尽的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 xcode(仪器)中的 iPhone 应用程序内存泄漏

iPhone 内存泄漏工具

检查xcode中c代码的内存泄漏

iphone/ipad 内存泄漏仪器工具

如何在linux下检测内存泄漏

如何检测内存泄漏