removeFromParent 和 destroy有什么区别吗?

通过测试发现,removefromparent后并没有调用节点的onDestroy方法,不知道内存能否释放。而调用destroy后会调用onDestroy方法但不会立即从父节点移除,而是下一帧才会从父节点移除,这好像很容易出错,比如调用onDestroy后立即遍历父节点的孩子就会出现不是预想的结果。想问的问题就是:1,为什么removefromParent后没有调用onDestroy呢?是不是没有释放内存?而之前c++版引擎是没这个问题的。2,调用destroy方法后为什么没有立即从父节点移除呢?不知道这样设计的初衷是什么。目前为了安全都是同时调用remove和destroy,感觉挺奇怪的。项目快上线了,希望creator越来越好。

回答第一个问题:我经常会把一个节点removeFromParent后添加到另一个地方。

可以释放,但是你要小心别持有了引用

因为你 remove 完还能再 addChild 到其它父节点,所以 remove 是一个临时性的操作,不应该销毁节点

初衷是为了保证销毁的节点在当帧仍然能正常使用。这样能避免很多逻辑执行先后顺序错乱引起的 bug。而且你在迭代器里面访问元素时,也不会因为元素个数的增删导致迭代器出错。(比如边遍历边 destroy 之类的)

好吧,那意思就是我想从父节点移除并删除一个节点就只能同时调用remove和destroy比较稳妥了。还有你说removefromparen后也可以释放内存,那为什么不执行onDestroy呢?onDestroy不是类似于析构的函数吗?

removeAllChildren是不是也不保险了,得用for循环去destroy啊

我现在有有个情况,大致是这样
this._cellPool = new cc.NodePool();
for (var index = this.content.childrenCount - 1; index >= 0; --index) {
this._cellPool.put(this.content.children[index]);
}
this._cellPool = null;
这样做有问题不

destroy 已经包含了 remove 操作,节点不要时直接 destroy 就好了

onDestroy 是销毁操作,用户不调用 destroy 怎么能乱销毁

别考虑保不保险,对象不用时就 destroy,要用就 removeFromParent

没问题。。。。

是不是得有个destroyAllChildren接口:unamused:

是的,应该是 1.3 就已经有了

似乎没有搜到


不好意思我记错了,要 1.5 才有!

下个版本的文档,会补充这方面的内容。

http://www.cocos.com/docs/creator/scripting/create-destroy.html#

destroy 和 removeFromParent 的区别

调用一个节点的 removeFromParent 后,它不一定就能完全从内存中释放,因为有可能由于一些逻辑上的问题,导致程序中仍然引用到了这个对象。因此如果一个节点不再使用了,请直接调用它的 destroy 而不是 removeFromParent。destroy 不但会激活组件上的 onDestroy,还会降低内存泄露的几率,同时减轻内存泄露时的后果。

总之,如果一个节点不再使用,destroy 就对了,不需要 removeFromParent 也不需要设置 parent 为 null 哈。

1赞

嗯,就是因为这个帖子,所以更新了你现在看到的文档。

1赞

那我如果棋牌中,我发牌时候addChild进来,弃牌时候是destroy 还是removeFromParent呢??
我下一局发牌时候还是addchild的.

兄弟 棋牌用对象池

你要重新add,当然就不能destroy了。记住,removeFromParent 通常需要传入一个 false,否则默认会清空节点上绑定的事件和 action 等。

我经常用一个layout,然后用预制件实例化里面的表项,加到layout里面,不用的时候直接,用这个嗯layout 调用removeAllChild的方法,是不是也有问题?得一个一个的destroy

@jare destroy有一个不好的设计,当前帧没有从相关的children数组移除,这个设计感觉不合理
当前帧可用也应该从children移除吧