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的时机是下一帧,开发时需要特别注意!!!
posted @ 2025-10-17 17:43  syb7384  阅读(2)  评论(0)    收藏  举报