关于CCArmature的removeFromParent无法析构的问题

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怎么解决

您好,感谢您的反馈~~该问题已经提交给开发工程师,我们会尽快解决该bug,并将在解决后第一时间公布解决方案。感谢您对CocoStudio的支持。

同样的问题求解

求2.2.2的patch

推荐升级2.2.3,因为2.2.3对结构未做调整,主要是bug的修复。所以升级会很平滑。

我查过2.2.3这个问题,没有得到解决,我们沟通完后我把2.2.2的patch发到此贴内

— Begin quote from ____

引用楼主flysec于2014-03-15 20:04发表的 关于CCArmature的removeFromParent无法析构的问题 :
cocos2d-x 2.2.2版本

测试代码如下:
//构造CCArmature
UIImageView imageView = (UIImageView)UIHelper::seekWidgetByName(_rootLayout, “name”);
http://www.cocoachina.com/bbs/job.php?action=topost&tid=194359&pid=tpc

— End quote

看来楼主是要做动态删除armature啊 小弟做游戏中人物变身也遇到类似问题 求帮忙 感激不尽

— Begin quote from ____

引用第5楼ixgsoul于2014-05-15 11:31发表的 回 4楼(hanrea) 的帖子 :
我查过2.2.3这个问题,没有得到解决,我们沟通完后我把2.2.2的patch发到此贴内 http://www.cocoachina.com/bbs/job.php?action=topost&tid=194359&pid=952364

— End quote

想知道 动态的更改armature的数据怎么修改
例如armature开始创建了A的动画
然后我想实现变身的功能

— Begin quote from ____

引用第7楼yuwenbai于2014-05-15 19:35发表的 Re:回 4楼(hanrea) 的帖子 :

想知道 动态的更改armature的数据怎么修改
例如armature开始创建了A的动画
然后我想实现变身的功能 http://www.cocoachina.com/bbs/job.php?action=topost&tid=194359&pid=952835

— End quote

删除掉之前的,重新再创建一个

— Begin quote from ____

引用第7楼yuwenbai于2014-05-15 19:35发表的 Re:回 4楼(hanrea) 的帖子 :

想知道 动态的更改armature的数据怎么修改
例如armature开始创建了A的动画
然后我想实现变身的功能 http://www.cocoachina.com/bbs/job.php?action=topost&tid=194359&pid=952835

— End quote

有 一个比较麻烦的办法:
把两个动作都做到一个动画工程里面
play 不同的动作名字即可

目前看来已经创建出来的CCArmature不能重新加载另外一个工程