【提一个BUG】node.children 返回的结点数组,不能被回收?

Mac版本,Creator 1.10.2版本:

bug描述:

第一种方式:遍历children数组,移除操作,我测试发现,数据确实移除了,节点树中也没有node了,但是显示上没移除,浏览器中依然能看到那个显示对象,依然能看到那个显示对象,依然能看到那个显示对象

        let nodeArr = this.node.children;
        while(nodeArr.length > 0) {
            let nodeChild = nodeArr.pop();
            nodeChild.removeFromParent();
            cc.log("回收没用:",nodeChild);
        }

第2种方式 :用另外一个数组 _arr 保存node,通过遍历这个数组移除,没问题,显示对象也移除了;

       while(this._arr.length > 0) {
            let nodeChild = this._arr.pop();
            nodeChild.removeFromParent();
            cc.log("回收有用:",nodeChild);
        }

备注:不发demo了行吗?这么简单明了,也非常非常容易自己动手操作一下,应该没问题的哦。

数组引用的问题:
let children = [1, 2, 3];
arr = children;

arr.pop();
console.log( children ); // [1, 2] <== 问题在这,removeFromParent() 无效了

参考下!

what ?

你这是小学生面试题,哈哈,能让你老大看一下这个问题吗?谢谢哥们。

经过群里哥们指点,我把问题的原因说一下吧,原来是源码做了indexOf的判断,

发2张图吧:

removeFromParent 调用了 removeChild,然而 removeChild 源码里,做了this._children.indexOf(child) > -1 的判断,而我是直接使用了pop(),所以没有真正的进入执行移除代码。

完毕。

ps: 我觉得这里源码是可以优化一下的,比如开放给开发者使用的children,做一下浅克隆处理:
return this._children.slice();

人家说的没问题吧。。。话说,请教人的时候能放尊重点吗?而且这么简单的问题有脸上论坛问?

this.node.children本来就是引擎管理的,你非要自己pop修改。。。。

没问题?没问题?没问题?没问题?没问题?

一个 removeAllChildren 可以解决的,非要自己搞,还要怼引擎组,脑回路清奇

哈哈,楼主真逗