我在cocos2d-x v.2.2.2中为Player* _player
场景添加了HelloWorldScene
指针。我已经定义了class Player : public cocos2d::Object
,因此引用了它。我HelloWorldScene
的创建方法如下所示
Scene* HelloWorldScene::createScene(Player* player)
{
auto scene = Scene::create();
auto layer = HelloWorldScene::create();
layer->_player = player;
player->retain();
scene->addChild(layer);
return scene;
}
其中player
在AppDelegate::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 :(得分:0)
所以我的问题的前提是错误的 - 我不知何故认为一切都必须在程序终止时释放。但是,正如我昨天重新学习的那样,操作系统当然会在程序终止后回收已分配的内存。因此,不必在堆栈中释放最后一个场景。