【发布时间】: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 数组,那么可以。如果你的意思是一个专门的集合类,那么没有。集合改为保留其元素。