【问题标题】:No memory leaks, yet still running out of memory?没有内存泄漏,但内存仍然不足?
【发布时间】:2010-09-14 21:02:20
【问题描述】:

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

我会在关卡结束时从关卡中移除所有对象,并在新关卡开始时重新分配新对象。 Instruments 告诉我没有内存泄漏。当我通过工具向我展示分配是主要问题的地方时,问题似乎并非来自一个地方,而是我的所有对象。

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

【问题讨论】:

    标签: iphone memory-management cocos2d-iphone


    【解决方案1】:

    仅仅因为仪器没有显示泄漏,并不意味着您仍然没有分配未使用的内存。注意 ObjectAlloc 图,看看它是否不断上升而没有下降。

    【讨论】:

      【解决方案2】:

      如果您分配了未使用且无法清理的内存,这与泄漏一样糟糕,即使您在技术上没有泄漏任何内容,因为您在某处隐藏了一些未使用的引用。

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

      【讨论】:

      • 据我所知,我正在清理我当前未使用的所有内存。我有几个不同对象的 NSMutableArrays,在每个级别结束时,这些对象被清除然后释放。整个游戏层也会在每个关卡结束时被删除,因此这些层中未释放的任何内容都将被仪器计为泄漏。
      【解决方案3】:

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

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

      提示:向所有场景类添加 -(void) dealloc 方法,并在那里设置断点。如果您更改了一个场景并且在场景转换完成后没有调用它的 dealloc 方法,那么您就是在泄漏这个场景(它没有被释放)。

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

      【讨论】:

      • 我真的不认为我的代码中有任何循环依赖。
      • 我已经在我的所有场景类中都有了 dealloc 方法,并且我已经在其中放置了断点,并且还在调用 [super dealloc] 之前检查了保留计数,它是 1,所以这听起来对我来说是正确的。
      【解决方案4】:

      小心自动释放的对象,因为它们不会立即释放。如果您有很多分配和自动释放的部分,请尝试在它们上使用特定的自动释放池。 我在为游戏 AI 创建巨大的决策树(使用 NSArrays)时发生了这种情况。

      【讨论】:

        【解决方案5】:

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

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

        这将做的是在这个重复动作的每个起点标记堆,并将该点创建的对象与您上次标记堆时创建的对象进行比较。只有在这两个点之间创建并且在内存中仍然存在的对象才会被列出。

        如果您正在累积对象,但它们不是泄漏或被泄漏工具遗漏,它们应该显示在此处。通过这种方式,我发现了许多微妙的内存积累,尤其是当您将其与 UI 自动化工具配对以自动执行您正在测试的重复操作时。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-13
            • 2019-11-11
            • 2016-08-13
            • 2013-04-30
            相关资源
            最近更新 更多