疑问,节点销毁后,node == null 和 node.isValid

先赋值一个节点变量,然后destroy掉

let _testNode: cc.Node = this.node.getChildByName(“testNode”);
_testNode.destroy();

节点被销毁后,过段时间,再log出相关信息

console.log(_testNode.isValid); // false
console.log(_testNode == null); // false

疑问:当节点被销毁后,对应的变量为什么不为null?销毁节点后,变量储存的是什么?是节点的缓存吗?如果不手动_testNode = null,那他会一直不为null吗?

1赞

好像下一帧才会销毁吧

this.scheduleOnce(function () {
//这样输出
},0)

我的意思是,节点被销毁后,过段时间,再log出相关信息;destroy掉之后,确实是下一帧才会被销毁;log出来的时候isValid 已经是false了,主要是变量不为空的问题

引擎不知道你这个获取的node是否还有用啊,destroy只是从场景中移除了,你需要吧这个变量置空,node才可以被回收啊

1赞

cc.isValid(node)才判断此时节点是否有效。 node.destory() 只是给节点一个脏标记, 并不是立即销毁,而是在Obj._deferredDestroy层销毁。(“在下一帧销毁”这个说法并不严谨,这取决于node.destory()的时机,如果destory在该帧的Obj.deferredDestory之前执行,那么代码执行到当前帧的Obj.deferredDestory会销毁;如果node.destory()在Obj.deferredDestory之后,则是下一帧销毁了)

1赞

基于问题总结一下,所以当只是节点被销毁,引用的变量不置空的情况下,节点真正所占有的内存空间不会被回收,而当前的变量只是引用类型,引用到这块内存上,自然也不为空;

感谢楼上各位大佬的解答