2013-10-27 37 views
0

我有一個名爲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::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頁面爲gamesArray中的每個遊戲創建一個GameObject。每個遊戲物體連接到它的子鍵是用來轉到了GameScreen並能節省GameObjects ID的遊戲管理

GameManager::sharedGameManager()->setCurrentGame(gameNumber); 

CCDirector * pDirector = CCDirector::sharedDirector(); 
CCScene* pScene = GameScreenScene::scene(); 
pDirector->replaceScene(pScene); 

現在怪異的一部分,當我到了GameScreenScene從遊戲管理器中的數據就沒了,除了目前遊戲仍然顯示正確的值。

我已經把一些日誌來診斷問題,但我似乎無法弄清楚。

我可以在GameListScene更改爲GameScreenScene之前讀取值,但一旦它改變,值就會消失。

我也嘗試讀取GameObject按鈕調用中的數據,但數據在那裏也不存在。

我可以添加更多的代碼,如果它可以幫助解決這個問題,我只是不想洪水這個,如果它是一件容易的事情。

任何幫助都會很棒。

+5

如果你真的希望它是一個有保證的單例,你應該使構造函數是私有的,所以唯一的構造路徑是'sharedGameManager()'方法。將_sharedGameManager指針作爲私有靜態成員移動到類中也可能會有幫助。 – Charlie

+0

感謝您的評論,但這似乎沒有解決任何問題。 –

回答

0

您不保留您的autorelease對象(即電子郵件和名稱字符串),導致在發佈數據時刪除其數據。 currentGame仍然存在的原因是它是一個int(不是自動釋放指針)。

您可以使用CC_SYNTHESIZE_RETAIN而不是CC_SYNTHESIZE來保留這兩個字符串以自動保留它們。

+0

這就是我一直在尋找的東西。謝謝! –

+0

快速問題。如果我使用CC_SYNTHESIZE_RETAIN doe這autorelease? –

+0

不可以。你必須自己釋放它。只需在父對象的構造函數中分配NULL,並在父對象的析構函數中分配CC_SAFE_RELEASE(以避免垃圾值和內存泄漏)。除此之外,它將自行處理保留/釋放情況。 – nomann

0

如果我是正確的,

CCObject(也許init()函數)的構造函數調用自動釋放()和未連接到場景,即使是單一實例一幀後automately破壞的情況。

我認爲你的GameManager類沒有理由繼承CCObject。