ccc 1.4.2
报错日志统计显示jsb_polyfill.jsc中报t._components is null 因为没有堆栈信息无法知道是哪里调用了。
不是必现bug,现在游戏每天有几千活跃了,每天总有几个人反馈卡住,也就是报错了。
目前我自己分析是由于我代码里面调用了已经被销毁的component的方法导致的。这种像幽灵一样的bug,我自己测试从未出现过,困扰我一个多星期了,我把我有可能在网络异步调用、定时器调用被销毁的对象的地方都检查了一遍。修改提交,还是有人反馈卡住。
求大神分析,如何定位这种bug。
谢谢反馈,我这边查一下吧,查好后会答复
这里是应该加个判断,事件是延迟分发的,确实有可能会遇到节点被移除后,事件才被分发的情况
判断建议写成 if ( !this.target.isValid ) { return; }
好的,多谢多谢
从未调用过destroy。 在从未调用过destroy的情况下,对象是有可能变成invalid的吗?比如被垃圾回收。 但是这也不对啊,我既然能够调用到,怎么会被回收呢。。。
什么情况下,节点的components会变为null ? 我没有调用过destroy哦
切换场景时,旧场景的对象会变成 invalid,导致 components 变为 null
嗯,我也是怀疑这个问题。但是我的bug更像是由于对象池引起的,旧的场景销毁了,除了destroy component,还会把场景node的所有子node全部destroy的吧?那这样就有可能导致我对象池里面的对象变成invalid。我上一个版本还打了个补丁,从对象池get的时候判断一下 a = node.getComponent(A), 如果a invalid 就new一个返回。 这里我认为 node.isValid 等同于 a.isValid 这里逻辑有问题吗?
