PS: 2020-4-29 现在版本的unity已经不会出现这种情况了
PSS: 2020-9-8 其实还是有的,这是使用event造成的内存泄漏,现在难以避免,只能小心为上。不过好在unity封装了一个UnityEvent,将event的管理权交付给了unity系统,所以在destroy对象后,监听也会一并被解除,就是不知道性能如何。
PSSS:性能不咋地,需要在性能与易用度之间进行取舍
最近在写脚本的时候出了个挺诡异的bug。
有GameObj1和GameObj2
obj1上挂载的脚本监听了obj2上的脚本里的事件。
而obj1上用于响应事件的函数里使用了自身的gameObject属性。
接着我需要把obj1销毁。
在obj1被销毁后,obj2触发了事件,这时log窗口疯狂地报错,提示gameObject已被销毁。
懵逼了很久,之后花了大量的时间来找问题的根源。
功夫不负有心人,在我吱吱不倦地搜寻下,终于找到了这个诡异的万恶之源。
因为在我之前的尝试中,我认为,当gameObject被销毁后,其身上挂载地脚本也会被gc收走,监听的函数不再调用。
但这时我发现之前似乎都是巧合,可能是由于某些逻辑原因造成了我对于机制的误判。
当gameObject被销毁后,脚本若是在监听某些事件,是不会被gc收走的。
这就可以解释之前出现的情况。
我的监听函数里有调用gameObject的语句,当gameObject已经被Destroy了,脚本仍然在监听,此时obj2触发了事件,失去了gameObject的监听脚本自然会报gameObject已被销毁之类的错误。
那么要解决这个问题的话,我就得在对象销毁时解除所有事件的监听。
这显然太麻烦了,有一万种原因会让我忘记这个操作,引起的bug也并不是那么好找。
目前还没有更好的方法来替代它。