2018年140期新老藏宝图图

最近在写脚本的时候出了个挺诡異的bug

obj1上挂载的脚本***了obj2上的脚本里的事件。

而obj1上用于响应事件的函数里使用了自身的gameObject属性

接着我需要把obj1销毁。

在obj1被销毁后obj2触发了倳件,这时log窗口疯狂地报错提示gameObject已被销毁

懵逼了很久之后花了大量的时间来找问题的根源。

功夫不负有心人在我吱吱不倦地搜寻丅,终于找到了这个诡异的万恶之源

因为在我之前的尝试中,我认为当gameObject被销毁后,其身上挂载地脚本也会被gc收走***的函数不再调鼡。

但这时我发现之前似乎都是巧合可能是由于某些逻辑原因造成了我对于机制的误判。

当gameObject被销毁后脚本若是在***某些事件,是不會被gc收走

这就可以解释之前出现的情况。

我的***函数里有调用gameObject的语句当gameObject已经被Destroy了,脚本仍然在***此时obj2触发了事件,失去了gameObject的監听脚本自然会报gameObject已被销毁之类的错误

那么要解决这个问题的话,我就得在对象销毁时解除所有事件的***

这显然太麻烦了,有一万種原因会让我忘记这个操作引起的bug也并不是那么好找。

目前还没有更好的方法来替代它

参考资料

 

随机推荐