有人可以帮我找出为什么我们需要在addChild()之前调用retain(),我只是想如果我们调用addChild,池会管理我们添加的CCNode,那么为什么我们需要保留它并由他们自己发布?
bool GameOverScene::init()
{
if( CCScene::init() )
{
this->_layer = GameOverLayer::create();
this->_layer->retain();
this->addChild(_layer);
return true;
}
else
{
return false;
}
}
GameOverScene::~GameOverScene()
{
if (_layer)
{
_layer->release();
_layer = NULL;
}
}
答案 0 :(得分:2)
我不熟悉Cocos2D-X中的内存管理,它是用C ++编写的。但是,如果它类似于Cocoa中的引用计数内存管理,那么每次设置实例变量时,都应释放先前的值并保留新值。
当然,在这种情况下,我们碰巧知道通过将它作为一个孩子添加到我们自己,它也将保留在那里。但是,它依赖于其他东西来保留它,从而使您的代码变得脆弱。因此,每次创建实例变量时,都必须考虑是否可以通过其他内容保留它,并且您必须在使用此变量的任何地方记住此决策。最好始终保持实例变量。保留它的次数永远不会伤害。
答案 1 :(得分:0)
感谢您的回复,但我遇到了另一个问题:
void TextureCacheTestScene::runThisTest()
{
CCLayer* pLayer = new TextureCacheTest(); // not add the reference for pLayer
addChild(pLayer); // add 1
CCDirector::sharedDirector()->replaceScene(this);
pLayer->release(); // delete 1
}
为什么我们需要在replaceScene()之后调用release()? 我只是发现replaceScene为场景添加了参考而不是图层,所以我对发生的事情感到困惑: