http://blog.csdn.net/zlqqhs/article/details/21789481
情况如下:
游戏内战斗界面战斗胜利,弹出胜利窗口,点击窗口中的下一关按钮切换到加载资源场景,
此时游戏处于暂停状态,所有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
#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();
m_pActionSet = CCDirector::sharedDirector()->getActionManager()->pauseAllRunningActions();
m_pActionSet->retain();
调用resume()时执行以下代码:
- CCDirector::sharedDirector()->getActionManager()->resumeTargets(m_pActionSet);
- m_pActionSet->release();
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();
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中的引用
http://blog.csdn.net/zlqqhs/article/details/21789481