cocod2d-x-关于场景切换,CCAction未执行完,仍握有引用造成内存泄漏
cocod2d-x--关于场景切换,CCAction未执行完,仍持有引用造成内存泄漏
游戏场景进入时调用show(),初始化资源
调用resume()时执行以下代码:
调用close()时执行以下代码:
通过close()里的操作可以释放CCAction中的引用
情况如下:
游戏内战斗界面战斗胜利,弹出胜利窗口,点击窗口中的下一关按钮切换到加载资源场景,
此时游戏处于暂停状态,所有CCAction都处于暂停状态,切换场景时,战斗场景中还有CCAction
未执行完,仍持有执行CCAction对象的一个引用,切换场景后引用不为0,则造成内存泄漏
自己定义每个Scene的生命周期,其父类如下:
#ifndef SCREEN_H #define SCREEN_H #include "cocos2d.h" using namespace cocos2d; namespace giant { class Screen : public CCScene { protected: int m_width; int m_height; protected: Screen(int width, int height); public: virtual void show() = 0; virtual void close() = 0; virtual void pause() = 0; virtual void resume() = 0; }; } #endif
游戏场景进入时调用show(),初始化资源
游戏暂停调用pause(),暂停场景中的更新,包括CCAction
游戏从暂停恢复调用resume(),恢复之前所有暂停的更新
游戏场景退出调用close(),销毁视图,释放内存
调用pause()时执行以下代码:
m_pActionSet = CCDirector::sharedDirector()->getActionManager()->pauseAllRunningActions(); m_pActionSet->retain();
调用resume()时执行以下代码:
CCDirector::sharedDirector()->getActionManager()->resumeTargets(m_pActionSet); m_pActionSet->release();
调用close()时执行以下代码:
CCActionManager *pActionManager = CCDirector::sharedDirector()->getActionManager(); CCSetIterator iter; for (iter = m_pActionSet->begin(); iter != m_pActionSet->end(); ++iter) { pActionManager->removeAllActionsFromTarget(*iter); } m_pActionSet->release();
通过close()里的操作可以释放CCAction中的引用