我有一个名为GameManager的单例类。
GameManager.h
#include "cocos2d.h"
using namespace cocos2d;
class GameManager : private CCObject
{
public:
GameManager(void);
virtual ~GameManager(void);
virtual bool init(void);
static GameManager* sharedGameManager(void);
CC_SYNTHESIZE(CCString*, email, Email);
CC_SYNTHESIZE(CCString*, nickName, NickName);
CC_SYNTHESIZE(int, currentGame, CurrentGame);
CCArray* gamesArray;
};
GameManager.cpp
#include "GameManager.h"
static GameManager* _sharedGameManager = NULL;
GameManager* GameManager::sharedGameManager(void)
{
if (!_sharedGameManager)
{
_sharedGameManager = new GameManager;
_sharedGameManager->init();
}
return _sharedGameManager;
}
GameManager::GameManager(void)
{
}
GameManager::~GameManager(void)
{
email->release();
nickName->release();
gamesArray->release();
}
bool GameManager::init()
{
CCLOG("GameManager Created");
email = CCString::create("");
email->retain();
nickName = CCString::create("");
nickName->retain();
currentGame = 0;
gamesArray = CCArray::create();
gamesArray->retain();
return true;
}
我用
在我的登录页面创建了GameManagerGameManager::sharedGameManager();
我的应用流程:
Login.cpp - > GameList.cpp - > GameScreen.cpp
在登录页面中,我存储了帐户电子邮件和昵称,以及在该页面中创建的gamesArray:
//store user info to gamemanager
GameManager::sharedGameManager()->setEmail((CCString*) parseOne->objectAtIndex(3));
GameManager::sharedGameManager()->setNickName((CCString*) parseOne->objectAtIndex(7));
GameManager::sharedGameManager()->gamesArray = gameObjectArray;
用户登录后,使用GameManager信息创建GameList。
所以此时单身人士的信息就存在了。
GameList页面为gamesArray中的每个游戏创建一个GameObject。每个GameObject都附有一个子按钮,用于转移GameScreen并将GameObjects id保存到GameManager
GameManager::sharedGameManager()->setCurrentGame(gameNumber);
CCDirector * pDirector = CCDirector::sharedDirector();
CCScene* pScene = GameScreenScene::scene();
pDirector->replaceScene(pScene);
现在奇怪的是,当我到达GameScreenScene时,来自GameManager的数据消失了,除了仍然显示正确值的currentGame。
我已经输入了一些日志来诊断问题,但我似乎无法弄明白。
我可以在GameListScene更改为GameScreenScene之前读取值,但一旦更改,值就会消失。
我也试过在GameObject按钮调用中读取数据,但是数据也不存在。
我可以添加更多代码,如果它可以帮助解决这个问题,我只是不想淹没它,如果这很容易。
任何帮助都会很棒。
答案 0 :(得分:0)
如果我是对的,
CCObject的构造函数(可能是Init()函数)调用autorelease()和未附加到场景的实例在一帧之后自动销毁,即使它是单例实例。
我认为你的GameManager类没有理由从CCObject继承。
答案 1 :(得分:0)
您没有保留自动释放对象(即电子邮件和名称字符串),导致其数据在发布时被删除。 currentGame仍然存在的原因是它是一个int(不是自动释放指针)。
您可以使用CC_SYNTHESIZE_RETAIN
代替CC_SYNTHESIZE
来保留这两个字符串以自动保留它们。