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】:我可以确定的是您不需要手动释放子节点。
通常,如果您输入了CCLayer
的release
方法,您很可能调用了removeChild
或removeFromParent
或其他类似方法。
它会在删除父节点之前删除并释放子节点。您可以查看Node::removeChild()
和了解详细信息。Node::detachChild
EDIT 2015-05-26 Node::detachChild
在版本 > 3.4 中被删除;请改用Node::removeChild
或Node::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的子节点的主要内容,如果未能解决你的问题,请参考以下文章