文章撰寫日期︰2013/02/28 14:56
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
一、問題
宣告了CCLabelTTF指標變數,
在後來的程式流程需要setString("")重新更改CCLabelTTF裡的文字,
卻遇到BAD_ACCESS問題,
告訴我CCLabelTTF已經放Cocos2d-X釋放掉了。
二、解決辦法
CCLabelTTF最好在CCNode的實作函式bool init()裡去宣告,
並且
在init()裡使用do{}while(0)機制,
讓指標變數物件一旦都實體化成功後,
return true來告知cocos2d-x該Scene的init()已實體宣告成功。
bool TestSceneLayer::init(){
bool bRet = false;
do {
setTouchEnabled( true );
setAccelerometerEnabled( true );
CCSize s = CCDirector::sharedDirector()->getWinSize();
// init physics
this->initPhysics();
label = CCLabelTTF::create("TestSceneLayer", "Marker Felt", 32);
this->addChild(label, 0);
label->setColor(ccc3(0,0,255));
label->setPosition(ccp( s.width/2, s.height-50));
bRet = true;
} while (0);
return bRet;
}
外層要使用該Scene的方式也很簡單,
就是使用Scene::create(),
此函式會去啟動init該函式。
cocos2d::CCScene* TestSceneLayer::scene()
{
// 'scene' is an autorelease object
CCScene * scene = NULL;
do {
scene = CCScene::create();
CC_BREAK_IF(! scene);
// add layer as a child to scene
TestSceneLayer* layer1 = TestSceneLayer::create();
scene->addChild(layerl);
} while (0);
return scene;
}
經過以上的使用,
應該就不會發生指標變數中途被釋放造成BAD_ACCESS的問題。