我遇到了一个很大的问题,我不明白为什么会这样。情况就是这样:
事实上,当我开始这个项目时,一切看起来都很完美,但是对于我制作的每个场景(页面),内存都在增加。 Page1:30Mb。,Page2:40,Page 3:54,Page 4:65 ...在7或8个场景之后,Instruments,Xcode或iPad本身挂起应用程序而没有任何消息(除了具有最终低内存警告的仪器) 。
为什么每个场景后都没有释放内存?也许是因为ARC和没有超级dealloc变量。为什么纹理看起来完全卸载但似乎没有卸载因为内存在崩溃之前无法控制地增长?
答案 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也不会释放音频。