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

cocod2d-x--关于场景切换,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中的引用