具有许多场景的Cocos2D项目无法正确释放内存

时间:2012-02-11 02:35:18

标签: memory cocos2d-iphone automatic-ref-counting kobold2d

我遇到了一个很大的问题,我不明白为什么会这样。情况就是这样:

  • 在Cocos2D中有10个场景的精彩项目。每个场景都是一本带有巨大精灵的书页。它使用Kobold2D 1.0.2实现。
  • 每个页面在单个类中都有公共对象,通过LayerColor放置一个公共菜单。
  • 精灵是PVR.CCZ RGBA4444和iPad内存中的TexturePacker 每个spritesheet加载大约16-20Mb。
  • 我使用CCTransitionTurnPage替换下一个的替换剧。
  • 在每个页面(类)的init方法中,加载纹理和FrameFile。
  • 在每个页面(类)的onExit方法中,卸载纹理和frameFile。我使用了dumpCachedTextureInfo,并说我完全从内存中加载和卸载纹理。
  • 当然,我从孩子身上移走所有物品。我的所有sprite都是在.h的接口部分声明的公共变量,因为我需要在类的每个方法中访问它们。
  • 我的项目是在ARC项目中使用Kobold2D集成的(但是你知道附加的Kobold2D项目没有启用ARC兼容性问题)

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

为什么每个场景后都没有释放内存?也许是因为ARC和没有超级dealloc变量。为什么纹理看起来完全卸载但似乎没有卸载因为内存在崩溃之前无法控制地增长?

2 个答案:

答案 0 :(得分:10)

我遇到了类似的记忆保留问题,仪器上没有泄漏。我无法得到 - (void)dealloc甚至被调用,直到我将以下内容写入每个场景的.m文件:

-(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:被调用后被释放。希望这对你有用。

答案 1 :(得分:3)

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

你必须在 - (void)清理中放置一个[array removeAllObjects]或[dictionary release],并在删除所有对象之后再添加一个[super cleanup];

与此同时,on - (void)onExit必须从实例中删除所有调度程序。不仅是调度程序本身。记得在任何CCNode上停止AllAction。但是,请小心,因为在任何removeAllObjects之前,必须在清理CCNodes(精灵等)时停止操作。

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