在我们使用xLua作为Unity中lua集成的解决方案时,遇到了一个问题,就是当我们使用在lua中把UI中的某个控件绑定相应的事件(如按钮的onClick事件),xLua绑定这个事件是用委托实现的,具体代码可以查看xLua的代码。而在程序退出的时候xLua会检查对应的委托有没有被正确的释放掉,如果没有释放掉的话就会抛出异常。代码如表所示:
1 public virtual void Dispose(bool dispose) 2 { 3 #if THREAD_SAFE || HOTFIX_ENABLE 4 lock (luaEnvLock) 5 { 6 #endif 7 if (disposed) return; 8 Tick(); 9 10 if (!translator.AllDelegateBridgeReleased()) 11 { 12 throw new InvalidOperationException("try to dispose a LuaEnv with C# callback!"); 13 } 14 15 LuaAPI.lua_close(L); 16 17 ObjectTranslatorPool.Instance.Remove(L); 18 translator = null; 19 20 rawL = IntPtr.Zero; 21 22 disposed = true; 23 #if THREAD_SAFE || HOTFIX_ENABLE 24 } 25 #endif 26 }
这说明我们并没有把对应的委托给释放掉。所以我们需要确保在程序退出之前所有的委托要正确地释放掉。方案大体如下,每一个UI都对应一个实例,这样在绑定控件的时候创建一个匿名函数,这个函数用于控件把这个控件绑定的事件清除掉,同时把这个匿名函数放到一个数组里面去,在这个UI销毁的时候调用一个函数&#