Cocos2d-X为什么在addChild()之前调用retain()

时间:2013-04-17 05:50:18

标签: cocos2d-x retain addchild

有人可以帮我找出为什么我们需要在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;
    }
} 

2 个答案:

答案 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为场景添加了参考而不是图层,所以我对发生的事情感到困惑:

  1. addChild(pLayer)//为pLayer添加引用;
  2. relplaceScene()//为场景添加引用;(不要为pLayer添加引用)
  3. pLayer-> release()//删除pLayer的引用; 那么为什么pLayer不被回收?我不认为如果这个场景还活着,那么pLayer就无法回收,我相信参考账户不会那么关心。