Cocos Creator2.x node节点destroy的问题
遇到一个Cocos Creator的坑点记录下:
cc.Node执行destroyAllChildren时,并不会立刻将node删除掉,并且子节点也没有立刻清空,在同一帧访问node的子节点依然可以访问到,只不过active被置为了false。
所以在执行了node的destroy方法后,如果在同一帧又加入了新的子节点,需要判断子节点是否是合法的,或者直接下一帧再加入子节点,查询引擎代码CCObject::destroy方法如下:
prototype.destroy = function () {
if (this._objFlags & Destroyed) {
cc.warnID(5000);
return false;
}
if (this._objFlags & ToDestroy) {
return false;
}
this._objFlags |= ToDestroy;
objectsToDestroy.push(this);
if (CC_EDITOR && deferredDestroyTimer === null && cc.engine && ! cc.engine._isUpdating) {
// auto destroy immediate in edit mode
deferredDestroyTimer = setImmediate(deferredDestroy);
}
return true;
};
可以看到Object在destroy的时候只是设置了一下flag,继承了CCObject的baseNode的重写destroy如下:
destroy () {
if (cc.Object.prototype.destroy.call(this)) {
this.active = false;
}
},
只是把节点隐藏了,真正执行Destroy的时机是下一帧,开发时需要特别注意!!!