使用 UnityActions 或 C# Actions 时如何最好地避免内存泄漏

问题描述

好的,我正在使用公共静态 UnityActions 进行事件驱动的多委托执行,我想避免内存泄漏。我担心我错过了删除注册代表。所以我想出了以下结构: 在注册事件时,我还会立即将注销命令注册一个单独的操作中,我可以在程序结束时执行该操作,如下所示:

// first establish a delegate to collect everything we need to de-register later OnDestroy
private delegate void Dreg();
private Dreg dreg;

// register for the event and create an entry in the de-register list 
//for later execution:
            MyEvents.someEvent += HandleSomeEvent;
            dreg += () => { MyEvents.someEvent -= HandleSomeEvent; };

在申请结束时,我只需要调用“dreg”来清除所有注册。到目前为止,这个 si 工作正常。

我的问题是:我能否将这两个语句更优雅地包装到一个函数中,以便我只需要发出一个语句而不是两个语句?我试过了,但我在作业中失败了。 我的实验看起来像这样:

public static void RegisterForEvent(UnityAction _eventToRegisterFor,UnityAction _thingToAdd)
{
    _eventToRegisterFor += _thingToAdd;
    dreg += () => _eventToRegisterFor -= _delegatetoAdd;
}
...
...Register(MyEvents.someEvent,HandleSomeEvent);// using this to register

...
...dreg.invoke;//near the end of the application to de-register everything

这似乎是不可能的。 我的问题似乎是我不太明白,实际上我分配给 MyEvents.someEvent 的是什么类型的“thingToAdd”?那是代表吗?它是在运行时解析的字符串吗?是函数吗?? 我也尝试使用 C# Actions,但也没有成功。 任何建议将不胜感激!手头有很多 thx :-)

解决方法

这是我解决这个问题的方法:

//---------------------------------------------------------------------------------------------    
public static void RegisterForEvent(UnityAction _eventToRegisterFor,UnityAction _handlerToAdd)
{
    _eventToRegisterFor += _handlerToAdd;
    dreg += () => _eventToRegisterFor -= _handlerToAdd;
}

//---------------------------------------------------------------------------------------------
//...the two lines above could be replaced with this one line call...

RegisterForEvent(MyEvents.SomeEvent,HandlerForSomeEvent);

//---------------------------------------------------------------------------------------------
//...and at the end the invokation of "dreg" will clear the event delegates
private void OnDestroy()
{
    dreg.invoke;//near the end of the application to de-register everything
}