【问题标题】:Cocos2d-X why call retain() before addChild()Cocos2d-X 为什么在 addChild() 之前调用 retain()
【发布时间】:2013-04-09 18:31:05
【问题描述】:

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

【问题讨论】:

  • 也许答案是一旦我们有了一个 CCNode* 的类成员变量,那么我们需要为它调用retain?
  • 实际上,即使您删除了保留和释放调用,都应该可以正常工作。节点在添加到某个父节点后被保留。当然,在父级存在之前。
  • @Morion:当然,但依赖它是脆弱的。作为一般规则,保留实例变量总是更容易,而不必考虑特定变量是否可能被其他东西保留。
  • @newacct:按照您的逻辑,将对象添加到数组后保留对象并在删除后释放是正常的。
  • @Morion:不,因为数组的元素不是实例变量。如果您的意思是常规 C 数组,那么可以。如果你的意思是一个专门的集合类,那么没有。集合改为保留其元素。

标签: cocos2d-x retain addchild


【解决方案1】:

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

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

【讨论】:

  • 你能帮我找出另一个问题吗?
【解决方案2】:

感谢您的回复,但我遇到了另一个问题:

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就不能被回收,我相信参考账号不会在意。

【讨论】:

  • 这不是您问题的答案(实际上与您的问题无关),所以不应该在这里。你真的应该开始一个新的问题。但是如果说 Cocos2d-X 的内存管理类似于 Cocoa 的内存管理,那么new TextureCacheTest() 看起来就像 Cocoa 中的[[TextureCacheTest alloc] init]。换句话说,它返回你“拥有”的东西,即它已经被保留了一次。因此,它需要与作用域末尾的release 平衡。
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 2014-01-08
  • 2011-04-19
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2012-08-01
相关资源
最近更新 更多