触发释放内存的释放?

时间:2011-12-01 17:17:36

标签: objective-c memory-management

我的应用程序因使用“快速”或者说“稳定”而导致内存不足而导致崩溃。

应用程序本身由许多屏幕组成,其上有许多分层图形。 为了不将大量数据加载到内存中,我会在用户离开一个屏幕时释放所有加载的内容,然后开始加载下一个屏幕的图形并显示它们。

在大多数情况下效果很好,但有一种方法可以让应用程序崩溃,我不知道如何防止它。

如果用户继续在屏幕之间导航,没有实际暂停,则即使释放对象或至少调用释放方法,也不会释放内存。在用户停止滑动或应用程序崩溃之前,内存变得越来越丰富。

当我使用乐器(以及显示可用物理内存的屏幕显示)监视内存使用情况时,我看到一旦用户停止,并且应用程序处于空闲状态,则需要五到十秒,然后是大块物理内存一次被释放。就像我的iPad上高达90MB一样。

我非常有信心剩下的对象没有剩余的引用。如果引用仍然存在,则几秒后它们将不会被卸载。所以我对如何改进这个问题没有真正的想法。

有没有办法告诉设备实际释放“已释放”的内存?或者除了为所有对象调用release并确保没有引用之外,还有什么“额外”需要做的吗?

更新

我在cocoabuilder.com上的帖子中找到了可能的原因。有人指出,从视图中删除的图层实际上并没有立即释放,而是延迟了6到10秒。什么与我看到的延迟完全匹配。这也很有道理。

当图层为图像保存引用(.contents)时,会有一个活动引用,将图像保存在内存中,直到最终释放图层。

我尝试通过设置.contents = nil删除引用,但这并没有解决问题。我还没有看到遗漏的东西。

2 个答案:

答案 0 :(得分:0)

也许您应该考虑使用-[NSAutoreleasePool drain]“如果自上次收集后分配的内存大于当前阈值,则触发垃圾收集。”

更新使用release而不是autorelease也是明智之举。正如你所观察到的那样,一个被立即触发,另一个需要几秒钟。

答案 1 :(得分:0)

如果您正在释放对象,但没有找到正在释放的内存,那么您将完全保留对象而不是实际完全释放它们。你所经历的是一大堆内存泄漏。尝试在“仪器”下运行您的应用程序并使用“泄漏”工具。