removeFromParent 和 destroy有什么区别吗?

removeFromParent 和 destroy有什么区别吗?
cc.NodePool 的 put 也有移除的作用吗?

1赞

最好还是用destroy

1赞

destroy 后,节点不可用。
removeFromParent 后,节点可重新 add 回场景中。
当节点要销毁时,请 destroy。
当节点要暂时从场景中移除,请 removeFromParent。

4赞

请问那从内存上来看destroy后内存会下降,而removeFromParent不会下降吗

destroy 会更保险一些。而且会执行组件的 onDestroy 方法。

1赞

意思是说现在的removeFromParent不能删除节点了嘛?这坑挖的!都是从cocos2dx过来的,今天才知道removeFromParent原来不是以前的那个了!

removeFromParent 行为并没有改变,你继续用这个删也是可以的。只是现在 destroy 赋予了更明确的含义,使用 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 才有!

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