【问题标题】:how to release CCLayer's child node in cocos2d-xcocos2d-x中如何释放CCLayer的子节点
【发布时间】: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;
    }
}

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

【问题讨论】:

    标签: memory-management memory-leaks cocos2d-x autorelease


    【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        相关资源
        最近更新 更多