问题描述
好的,我正在使用公共静态 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
}