2014-03-06 50 views
0

我在cocos2d-x v.2.2.2中添加了Player* _player指向我的場景的指針。我已經定義了​​,所以它被引用計數。我對HelloWorldScene創建方法看起來像這樣爲什麼不刪除cocosd2d-x中的最後一個場景觸發場景析構函數?

Scene* HelloWorldScene::createScene(Player* player) 
{ 
    auto scene = Scene::create(); 
    auto layer = HelloWorldScene::create(); 
    layer->_player = player; 
    player->retain(); 
    scene->addChild(layer); 
    return scene; 
} 

其中playerAppDelegate::applicationDidFinishLaunching()實例化。現在,因爲我已經保留_player(我今天感覺像一個不錯的傢伙),我已經決定將其釋放,以及:

HelloWorldScene::~HelloWorldScene() 
{ 
    if (_player) 
    { 
    _player->release(); 
    } 
} 

到目前爲止好。然而,當HelloWorldScene被彈出,以下稱爲

void Director::popScene(void) 
{ 
    CCASSERT(_runningScene != nullptr, "running scene should not null"); 

    _scenesStack.popBack(); 
    ssize_t c = _scenesStack.size(); 

    if (c == 0) 
    { 
    end(); 
    } 
    else 
    { 
    _sendCleanupToScene = true; 
    _nextScene = _scenesStack.at(c - 1); 
    } 
} 

所以,每當HelloWorldScene在棧中的最後一個場景,它不會被破壞? (至少從XCode看起來就是這樣)

我不是C++特級大師,所以請原諒我的無知。然而,對我而言,這是非常意想不到的行爲。不應該在程序終止之前清理彈出的場景(通過讓_sendCleanupToScene = true並讓它運行一次迭代)?

顯然,我錯過了一些東西......如果有人能夠對此有所瞭解,我會很高興! :)

回答

0

所以我的問題的前提是錯誤的 - 我不知何故有一個想法,一切都必須在程序終止發佈。但是,正如我昨天重新學習的那樣,一旦程序終止,操作系統當然會回收分配的內存。因此釋放棧中的最後一個場景是不必要的。