没有内存泄漏,但仍然内存不足?

时间:2010-09-14 21:02:21

标签: iphone memory-management cocos2d-iphone

在我的cocos2d应用程序中,我使用仪器运行它并删除了所有内存泄漏。我让我的游戏输出屏幕上正在使用的内存量,随着游戏的进行它不断上升,直到我最终耗尽内存。每个级别的屏幕上的对象数量不会增加很多。这是一个相当简单的游戏,所以我不应该这么快就耗尽内存。

我在结束时从一个级别删除所有对象,并在新级别开始时重新分配新对象。仪器告诉我没有内存泄漏。当我通过仪器向我展示分配的位置时,问题的主要部分似乎并非来自一个地方,而是我的所有物体。

任何想法可能是什么问题?

6 个答案:

答案 0 :(得分:3)

仅仅因为乐器没有显示泄漏,并不意味着你还没有分配你没有使用的内存。注意ObjectAlloc图,看看它是否在不断下降的情况下不断上升。

答案 1 :(得分:1)

如果你分配了你没有使用但无法清理的内存,那就像泄漏一样糟糕,即使你没有在技术上泄露任何东西,因为你已经在某处隐藏了一些未使用的引用。

查看您实际需要使用多少内存或保留以供将来在应用程序中使用的任何内容,然后将先前分配的任何其他内容视为泄漏并修复它。

答案 2 :(得分:1)

在Objective-C中,当使用自动释放对象时要警惕循环依赖!

如果创建对象A然后创建对象B的实例并将A传递给它,以便B保留A,并且A也保留B(例如通过将其作为子项添加到A),则可以轻松设置循环依赖关系因此两个对象都不会被释放。

提示:在所有场景类中添加 - (void)dealloc方法,并在那里设置断点。如果您更改场景并且在场景转换完成后未调用其dealloc方法,则表示您正在泄漏此场景(它未被释放)。

尝试通过寻找与我上面描述的设置类似的设置来找到泄漏。

答案 3 :(得分:1)

请注意自动释放​​的对象,因为它们不会立即释放。如果您有包含大量分配和自动释放的部分,请尝试在其上使用特定的自动释放池。 在为游戏AI创建巨大的决策树(使用NSArrays)时,它发生在我身上。

答案 4 :(得分:1)

检查在内存中聚合的对象的一个​​好方法是使用Instruments的新功能(在Xcode 3.2.3中)Heap Shot功能。

对正在运行的应用程序使用正常的分配工具。执行一系列重复事件,这些事件应该返回某个已知状态(例如,在导航控制器中向下一级并返回)。每次执行此操作时,请单击左侧边栏中的Mark Heap按钮以获取分配工具(在标题Heapshot Analysis下)。

这将做的是在此重复操作的每个起始点标记堆,并将该点创建的对象与最后标记堆时创建的对象进行比较。仅列出在这两个点之间创建并且在内存中仍然存在的对象。

如果您正在积累物体,但它们要么没有泄漏,要么被泄漏工具遗漏,它们应该显示在这里。我已经通过这种方式找到了许多微妙的内存构建,特别是当您将其与UI Automation工具配对时,可以自动执行您正在测试的重复操作。

答案 5 :(得分:0)

问题的大部分似乎是Sprites不会在cocos2d中释放,除非所有动作都已停止在那些精灵上。这是使用stopAllActions完成的。为所有建议干杯。