[cocosbuilder篇]onAssignCCBMemberVariable綁定後取值遇到EXC_BAD_ACCESS

文章撰寫日期︰2013/03/18 15:00
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

使用cocos2d::extension::CCBMemberVariableAssigner的callback:
virtual bool onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode);
來將CocosBuilder和Cocos2d-X源碼綁定時,
取出來的CCLabelTTF*無法setString,
產生EXC_BAD_ACCESS的問題

我的原始碼是這樣子寫的︰
bool GameScene::onAssignCCBMemberVariable(cocos2d::CCObject * pTarget, cocos2d::CCString * pMemberVariableName, cocos2d::CCNode * pNode){
    //Bind variables
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_question", CCLabelTTF *,GameScene::label_question);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice1", CCLabelTTF *,GameScene::label_choice1);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice2", CCLabelTTF *,GameScene::label_choice2);
    CCB_MEMBERVARIABLEASSIGNER_GLUE(this, "label_choice3", CCLabelTTF *,GameScene::label_choice3);

    label_question->setString("六隻眼睛、八條腿、四隻手、一條尾巴,請問這是什麼?");
    label_choice1->setString("兩個人騎在馬上");
    label_choice2->setString("妖怪");
    label_choice3->setString("不知道");

    return false;
}
label_choice3發生crash,報EXC_BAD_ACCESS錯誤。












二、解決方法

爬文後得知,
label_choice3還未完成初始化,
就使用setString產生了EXC_BAD_ACCESS。

解決方案建議再使用CocosBuilder的另一個callback回調函式︰
CCNodeLoaderListener的
virtual void onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader);


setString的方法,
也等到onNodeLoaded的callback回來了才攢寫
void GameScene::onNodeLoaded(cocos2d::CCNode * pNode, cocos2d::extension::CCNodeLoader * pNodeLoader){
    CCLog("into onNodeLoaded");

    //如果在onAssignCCBMemberVariable()就setString可能會遇到物件還沒創立完成的BAD_ACCESS
    label_question->setString(GameScene::question.c_str());
    label_choice1->setString(GameScene::choice1.c_str());
    label_choice2->setString(GameScene::choice2.c_str());
    label_choice3->setString(GameScene::choice3.c_str());
  
}
問題解決。

原來是太快使用這個綁定的變數了。

沒有留言 :

張貼留言