cocod2d-x--关于场景切换,CCAction未执行完,仍持有引用造成内存泄漏

来源:互联网 发布:淘宝翻译价格 编辑:程序博客网 时间:2024/05/18 03:00

情况如下:

游戏内战斗界面战斗胜利,弹出胜利窗口,点击窗口中的下一关按钮切换到加载资源场景,

此时游戏处于暂停状态,所有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中的引用

0 0