cocos2d-x中如何释放CCLayer的子节点

Posted

技术标签:

【中文标题】cocos2d-x中如何释放CCLayer的子节点【英文标题】:how to release CCLayer's child node in cocos2d-x 【发布时间】:2013-11-11 04:21:41 【问题描述】:

cocos2d-x 引用计数功能听起来很吸引人,但是在我的项目中使用它时,我发现“内存不足”的问题仍然无法消除,例如有一个非常简单的案例如下:

当我释放CCLayer时,它的子节点不会同时释放。对吗?在释放CCLayer之前,我必须手动释放子节点,如下所示?

void MyLayer::releaseChildren()
    CCArray * children = this->getChidren();//"this" pointer is the CCLayer
    CCObject * obj;
    CCARRAY_FOREACH(childen,obj)
    
      CCNode * child = static_cast<Node*>(obj);
      child->release;
    

如果你能分享你的项目实践,那对我很有帮助

【问题讨论】:

【参考方案1】:

我可以确定的是您不需要手动释放子节点。

通常,如果您输入了CCLayerrelease 方法,您很可能调用了removeChildremoveFromParent 或其他类似方法。

它会在删除父节点之前删除并释放子节点。您可以查看Node::removeChild()Node::detachChild了解详细信息。

EDIT 2015-05-26 Node::detachChild 在版本 > 3.4 中被删除;请改用Node::removeChildNode::removeFromParent

而您的“内存不足”问题可能是由其他问题引起的,例如未取消计划、未删除通知观察者或其他问题。

【讨论】:

【参考方案2】:

试试这个代码:

CCArray * children = this->getChildren();//"this" pointer is the CCLayer
CCObject * obj;
CCARRAY_FOREACH(children,obj)

    CCNode * child = static_cast<CCNode*>(obj);
    this->removeChild(child, true); //Remove the child 
    child->release();
    CC_SAFE_DELETE(child);

【讨论】:

以上是关于cocos2d-x中如何释放CCLayer的子节点的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2d-X中的ZORDER和Tag

cocos2D----CCLayer

cocos2d-x中锚点设置及定位方式

cocos2d-x CCScrollView 源代码分析

Cocos2d-x tilmap黑屏

cocos2d-x CCScrollView和CCTableView的使用