1

谁能帮我找出为什么我们需要在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;
    }
} 
4

2 回答 2

2

我不熟悉Cocos2D-X中的内存管理,它是用C++编写的。但是,如果它类似于 Cocoa 中的引用计数内存管理,那么每次设置实例变量时,都应该释放之前的值并保留新的值。

当然,在这种情况下,我们碰巧知道,通过将它作为一个孩子添加到我们自己,它也将保留在那里。但是,它会依赖其他东西来保留它,从而使您的代码变得脆弱。所以每次创建实例变量时,都必须考虑它是否可能被其他东西保留,并且在使用该变量的任何地方都必须记住这个决定。最好始终始终保留实例变量。多次保留它永远不会受到伤害。

于 2013-04-17T18:57:06.157 回答
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就不能被回收,我相信参考账户不会在意。
于 2013-04-19T03:05:16.167 回答