最近写UI单击事件时发现一个内存泄漏,经过反编译UnityEngine.dll查看源码,定位到了问题,总结一下。
过程重现:
按钮注册一个单击事件,反注册此事件后并不能释放delegate所引用的对象实例,再执行下委托的Invoke方法,才会释放对象实例。
过程重现:
按钮注册一个单击事件,反注册此事件后并不能释放delegate所引用的对象实例,再执行下委托的Invoke方法,才会释放对象实例。
反编译UnityEngine.dll发现了这段代码造成了内存泄漏:
// UnityEngine.Events.InvokableCallList
public void Invoke(object[] parameters)
{
if (this.m_NeedsUpdate)
{
this.m_ExecutingCalls.Clear();
this.m_ExecutingCalls.AddRange(this.m_PersistentCalls);
this.m_ExecutingCalls.AddRange(this.m_RuntimeCalls);
this.m_NeedsUpdate = false;
}
for (int i = 0; i < this.m_ExecutingCalls.Count; i++)
{
this.m_ExecutingCalls[i].Invoke(parameters);
}
}
// UnityEngine.Events.InvokableCall