[cocos2d-x篇]指標變數被釋放造成BAD_ACCESS

文章撰寫日期︰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的問題。

沒有留言 :

張貼留言