首页 > 其他 > 详细

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

时间:2014-03-22 13:36:39      阅读:470      评论:0      收藏:0      [点我收藏+]

情况如下:

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

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

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

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

原文:http://blog.csdn.net/zlqqhs/article/details/21789481

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!