iOS中的内存崩溃,实际内存使用率仅为5美分

时间:2010-10-27 16:45:34

标签: iphone memory-leaks ios

在我的应用中,我一直在寻找内存泄漏一段时间。截至目前,当我在观看记忆监视器的同时在两个视图之间来回切换时,实际内存在5到6兆之间波动。这一切都很好 - 据我所知,当我从视图中弹出时,一切都正常释放。但是,每次将视图推回视图堆栈时,虚拟内存都会继续增加,并且我的可用实内存会迅速下降(即使应用程序的实际内存使用量没有增加)。最终,这一切都会导致内存崩溃。这是否是任何特定问题的迹象,或者我只是在某处错过了内存泄漏?

编辑:奇怪的是,当应用程序仍然只耗尽大约5兆的实内存时,我得到内存崩溃。

5 个答案:

答案 0 :(得分:12)

不要使用-retainCount。

对象的绝对保留计数毫无意义。这是一个实现细节。它可能会受到许多因素的影响。

您应该调用release与导致保留对象完全相同的次数。不会少(除非你喜欢泄漏),当然,没有更多(除非你喜欢崩溃)。

有关详细信息,请参阅Memory Management Guidelines


在这种特定情况下,您正在泄漏内存,但泄漏无法找到它。泄漏的对象仍以某种方式连接到整个应用程序的对象图。也许通过通知,也许通过委托,无所谓 - 泄漏看到了参考,并得出结论,该对象可能仍然存在。

使用分配工具。将其配置为仅跟踪实时分配(因为您不关心已解除分配的对象)。用你的应用程序做一些事情。看看Allocations知道什么,并解释为什么所有这些对象应该坚持下去。您可以使用数据挖掘工具过滤到对象。

答案 1 :(得分:3)

无论如何,您还可以使用“Build - > Build and analyze”选项查找可疑的非传统代码。

答案 2 :(得分:3)

您可能在较低的API层中丢失内存的另一个原因是,如果您不从视图层次结构中删除所有视图(也就是说:不在任何地方调用[view removeFromSuperview])。至少这似乎发生在我身上。

请注意,大多数情况下这不是必需的,因为您只需释放主视图及其所有子视图,然后在需要时从视图控制器重建它。当你没有释放整个层次结构而只是从层次结构中删除其中的一些时,事情开始变得更加棘手。

在这种情况下,我得出的结论是,您可能在较低的API部分中缓存了缓冲区或图层,在这种情况下,您的分配工具将无法帮助您。 为了正确监控,您需要使用“内存监视器”(在系统中)。您将看到“物理内存空闲”行下降接近0是发出内存警告的最可靠指标。 使用此仪器的另一个优点是,您可以将其连接到正在运行的过程,从而可以轻松地将控制台输出和仪器一起运行。

答案 3 :(得分:2)

循环引用也不会计入Leaks中,但您可以在Allocations中跟踪它们。最好的办法是启动分配并进入一个你认为一切都应该消失的状态(或某些对象应该是)。如果他们闲逛,请潜入他们并查看他们被保留的位置,并找出适当的记忆所有权/释放。

对于Allocations,有一些它不会跟踪可能影响整体内存的事情。一些东西包括一些CGImage后备存储,一些CoreAnimation东西和一些数据库的东西。

答案 4 :(得分:-4)

您是否使用过“泄漏”性能工具?并查看管理器中的日志以查看是否有任何内容。

还要查看视图控制器的dealloc并确保正确释放它的所有对象?

相关问题