cocos2d-x 2.2.2版本
测试代码如下:
//构造CCArmature
UIImageView imageView = (UIImageView)UIHelper::seekWidgetByName(_rootLayout, “name”);
CCArmature *armature = CCArmature::create(…);
imageView->addNode(armature);
//删除CCArmature
armature->removeFromParent();
//测试代码完毕
调用removeFromParent这本是一个正常的清理流程,可以让armature的retainCount变为0,直接去析构这个类
但是实际上并非如此,Widget的addNode将插入的Node又cache了一次:_nodes->addObject(node);
代码如下
void Widget::addNode(CCNode* node, int zOrder, int tag)
{
CCAssert(dynamic_cast<Widget*>(node) == NULL, “Widget only supports Nodes as renderer”);
CCNodeRGBA::addChild(node, zOrder, tag);
_nodes->addObject(node);
}
这就造成removeFromParent无法执行到removeNode的代码:_nodes->removeObject(node);
void Widget::removeNode(CCNode* node)
{
CCNodeRGBA::removeChild(node);
_nodes->removeObject(node);
}
这样CCArmature的引用计数就不会归0,无法清理内存
除非调用imageView->removeNode(armature);
这种写法明显是不对的,破坏了removeFromParent的原则:根本就没有从parent(imageView)里彻底移除掉!
请开发组看一下这个BUG怎么解决