更改为另一个场景时从单件类丢失数据

时间:2013-10-27 23:38:37

标签: c++ singleton cocos2d-x

我有一个名为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;
}

我用

在我的登录页面创建了GameManager
GameManager::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按钮调用中读取数据,但是数据也不存在。

我可以添加更多代码,如果它可以帮助解决这个问题,我只是不想淹没它,如果这很容易。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

如果我是对的,

CCObject的构造函数(可能是Init()函数)调用autorelease()和未附加到场景的实例在一帧之后自动销毁,即使它是单例实例。

我认为你的GameManager类没有理由从CCObject继承。

答案 1 :(得分:0)

您没有保留自动释放对象(即电子邮件和名称字符串),导致其数据在发布时被删除。 currentGame仍然存在的原因是它是一个int(不是自动释放指针)。

您可以使用CC_SYNTHESIZE_RETAIN代替CC_SYNTHESIZE来保留这两个字符串以自动保留它们。