-
Creator 版本:2.1.3
-
目标平台: Web 只在浏览器测试,其他平台没测试
-
详细报错信息,包含调用堆栈:
-
重现方式:退出场景
-
之前哪个版本是正常的:无
-
出现概率:100%
-
额外线索:
var eventTargets = this.__eventTargets;
for (var i = 0, l = eventTargets.length; i < l; ++i) {
var target = eventTargets[i];
target && target.targetOff(this);
}
eventTargets.length = 0;
这个是我在引擎看到的代码,这里是在退出场景的时候,销毁节点时自动调用的,我的理解是为了清楚之前注册的监听。
我在这个节点注册了两个监听,是不同的对象的,所以这里的eventTargets.length为2,也循环了两遍。
但是在target.targetOff(this);的时候,我看了那边的代码:
proto.targetOff = function (target) {
this.removeAll(target);if (target && target.__eventTargets) {
fastRemove(target.__eventTargets, this);
}
};
这里其实已经对列表进行的删除
当第二次进入循环的时候i=1,但是eventTargets数组已经只有下标0的数据,所以循环退出
这个时候eventTargets.length 还剩下1,所以其实是没删干净的。
我知道在调用on的时候最好同步在不需要的时候调用off,这两个保证一对出现。
但是在我看到引擎在节点销毁时有做了这一步后,我很多都省略了off
目前这个只有在同一个节点,注册了多个节点的监听后才会有问题,只注册一个或者都是同个节点的是不会有问题的。
不知道新版本有没有这个问题,我现在已经准备对项目on的地方都加上off了,不依赖销毁节点自动off了