this.node.removeFromParent(); 删不干净

this.node.removeFromParent(); 删不干净是何原因?

比如:

var global = require(‘global’);

global.a = this;
this.a = 12;
this.node.removeFromParent();

在下一帧

cc.log(global.a.a);

还是能打印 出12。

这个是何原因? 要是removeFromParent并不能清除一个node( cleanup 在这没用?),那怎样才能释放一个 node 所有所占内存?

this.node.removeFromParent();
换成
this.node.destroy() ;

这样也没用, a =12 还是一直存在。

没看懂,这里的 a 和 node 是什么关系?

global.a = this;
this.a = 12;
你给的this,呀又不是this.node

节点调用 removeFromParent


可以看到节点只是从节点树移除了, 节点和脚本组件的关系依然存在, isValid依然为true, 这里只是一个赋值 parent=null, 可以把节点添加到其它节点树的其它位置, 节点就"活了"


节点调用 destroy


节点被移出节点树, 并且和脚本组件已经没关系了, 因为节点没有其它引用, 可以认为节点占用的内容已经被回收或者等待回收.脚本组件因为被当前的函数引用, 还不会回收, 等待timeout的函数执行完, 脚本组件占用的内存也会被回收.


CocosCreator 和 Cocos2d-x在对象的内存管理上是完全不同的.
因为c++没有自动内存管理, 谁申请内存谁负责释放内存(堆内存), 这是非常容易出错的, Cocos2d-x使用引用计数来做内存管理, 主要通过对象的容器(对象数组/对象字典)来做计数增减, 节点树就是这样一个容器. 所以节点树可以管理节点对象的内存生命周期. cocos2d-lua/js 虽然是脚本语言, 语言本身是有自动内存管理的, 但是节点的内存还是c++管理.
而creator因为要做h5游戏, 必须要用js做节点的内存管理, 为了统一接口, 在native上也使用js的内存管理.
而js的内存管理很简单, 一个对象没有引用, 它就会被销毁回收. 但是如何保证节点对象没有被引用呢? 一个节点被移除节点树,没有执行action, 没有事件监听, 除了本身挂载的脚本组件外没有被其它脚本引用, 那么就可以认为没有被引用, 垃圾回收会回收对象内存.
destroy会删除所有的action和事件监听, 所以调用destroy删除节点是有效的做法.

5赞

node调用了removeFromParent,又不是a调用的…你得看node有没有啊,a肯定一直有…
当然还是推荐destroy,文档里有