通过测试发现,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接口
是的,应该是 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 哈。
嗯,就是因为这个帖子,所以更新了你现在看到的文档。
那我如果棋牌中,我发牌时候addChild进来,弃牌时候是destroy 还是removeFromParent呢??
我下一局发牌时候还是addchild的.
兄弟 棋牌用对象池
你要重新add,当然就不能destroy了。记住,removeFromParent 通常需要传入一个 false,否则默认会清空节点上绑定的事件和 action 等。
我经常用一个layout,然后用预制件实例化里面的表项,加到layout里面,不用的时候直接,用这个嗯layout 调用removeAllChild的方法,是不是也有问题?得一个一个的destroy
