昨晚在捕鱼切换场景时发现会出现内存不足的现象,看了下代码发现了个问题。我们先看看代码
[[CCDirector sharedDirector] runWithScene:[ SceneA scene]];
[[CCDirector sharedDirector] replaceScene:[ SceneB scene]];
假设CCDirector以SceneA为起始场景,现在要替换为SceneB。那么:
将会触发一系列的方法被调用,如下: 7. dealloc: 当一个scene被搬上“台面”,它会收到onEnter,SceneB会收到onExit,最后交替完成在台面上的SceneA收到onEnterTransitionDidFini |
再看看cocos2d-x的源代码
void CCDirector::replaceScene(CCScene *pScene)
{
assert(pScene != NULL);
unsigned int index = m_pobScenesStack->count();
m_bSendCleanupToScene = true;
m_pobScenesStack->replaceObjectAtIndex(index - 1, pScene);
m_pNextScene = pScene;
// replaceScene赋值m_pNextScene,以致drawScene会触发setNextScene函数。
}
void CCDirector::setNextScene(void)
{
···;
if (! (newSceneType & ccTransitionScene))
{
if (m_pRunningScene)
{
m_pRunningScene->onExit(); //即 5. onExit: SceneA
}
}
···;
}
释放一些new出来的对象,应该在onExit()里面delete掉。之前不知道原理,new出来的对象在destroy()里面delete,结果就是运行时弹窗口了…