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

Jul*_*ñoz 5 memory cocos2d-iphone automatic-ref-counting kobold2d

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

  • 在Cocos2D中有一个很棒的项目有10个场景.每个场景都是一本带有巨大精灵的书页.它使用Kobold2D 1.0.2实现.
  • 每个页面在单例类中都有公共对象,通过LayerColor放置一个公共菜单.
  • 精灵是PVR中的TexturePacker .CCZ RGBA4444和iPad内存中每个spritesheet加载大约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本身挂起应用程序而没有任何消息(除了具有最终低内存警告的仪器) .

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

Bob*_*con 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];
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我一直用[[CCTextureCache sharedTextureCache] removeUnusedTextures]; 认为Cocos2D会发现纹理确实未被使用并因此将其删除.事实证明它无法可靠地确定它,因此removeAllTextures虽然速度较慢,但​​最好能够防止内存问题. (2认同)