5

我有一个很大的问题,我不太明白为什么会发生。情况是这样的:

  • 在 Cocos2D 中有一个很棒的项目,有 10 个场景。每个场景都是一本书的一页,上面有巨大的精灵。它使用 Kobold2D 1.0.2 实现。
  • 每个页面都有一个单例类中的公共对象,通过 LayerColor 放置一个公共菜单。
  • 精灵是 PVR.CCZ RGBA4444 中的 TexturePacker,在 iPad 中,每个加载的精灵表大约 16-20Mb。
  • 我将 CCTransitionTurnPage 用于 replaceScene 一个到下一个。
  • 在每个页面(类)的init方法中,加载纹理和FrameFile。
  • 在每个页面(类)的 onExit 方法中,卸载纹理和 frameFile。我使用了 dumpCachedTextureInfo 并说我可以完美地从内存中加载和卸载纹理。
  • 当然,我从孩子中删除所有对象。我所有的精灵都是在.h 的接口部分声明的公共变量,因为我需要在类的每个方法中访问它们。
  • 我的项目是在 ARC 项目中使用 Kobold2D 集成制作的(但您知道附加的 Kobold2D 项目由于兼容性问题而未启用 ARC)

事实是当我开始这个项目时,一切看起来都很完美,但我制作的每个场景(页面)的内存都在增加。Page1: 30Mb., Page2: 40, Page 3: 54, Page 4: 65... 在 7 或 8 个场景之后,Instruments、Xcode 或 iPad 本身挂起应用程序而没有任何消息(除了具有最终低内存警告的 Instruments) .

为什么每个场景后没有释放内存?也许是因为 ARC 和没有 super dealloc 变量。为什么纹理看起来完美卸载但似乎没有卸载,因为内存在没有控制的情况下增长直到崩溃?

4

2 回答 2

10

我在内存保留方面遇到了类似的问题,并且仪器中没有出现泄漏。在我将以下内容写入每个场景的 .m 文件之前,我什至无法调用 -(void) dealloc:

-(void) onExit {
    //unschedule selectors to get dealloc to fire off
    [self unscheduleAllSelectors];
    //remove all textures to free up additional memory. Textures get retained even if the sprite gets released and it doesn't show as a leak. This was my big memory saver
    [[CCTextureCache sharedTextureCache] removeAllTextures];
    [super onExit];
}

在实现这个之后,我的内存在每次调用 replaceScene: 后被释放。希望这对你有一些用处。

于 2012-03-05T19:08:54.017 回答
3

经过几个月的工作,我学到了关于 Cocos2D 最重要的一课。当您将任何 CCNode 对象放在 CCArray 或 NSArray 或 NSDictionary 上时,retain 会增加一...这意味着您必须在 CCLayer 或 CCScene 释放之前从这些对象中释放对象。

您必须在 - (void) cleanup 上放置一个 [array removeAllObjects] 或 [dictionary release],并且在删除所有对象之后,然后放置一个 [super cleanup];

同时,在 - (void) onExit 上,您必须从实例中删除所有调度程序。不仅是调度程序本身。请记住在任何 CCNode 上停止所有操作。但是,小心,因为从 CCNodes(Sprites 或其他东西)停止动作必须在任何 removeAllObjects 之前进行清理。

请记住:如果 CCLayer 或 CCScene 没有正确删除,SimpleAudioEngine 也不会释放音频。

于 2013-04-10T09:10:17.990 回答