Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用UnityActions或C#Actions时最好地避免内存丢失_C#_Unity3d_Memory Leaks_Delegates - Fatal编程技术网

如何在使用UnityActions或C#Actions时最好地避免内存丢失

如何在使用UnityActions或C#Actions时最好地避免内存丢失,c#,unity3d,memory-leaks,delegates,C#,Unity3d,Memory Leaks,Delegates,好的,我正在为事件驱动的多委托执行使用公共静态UnityActions,我希望避免内存泄漏。我担心我错过了删除注册代表的机会。因此,我提出了以下结构: 注册一个事件时,我也会立即注册一个命令,以取消注册到一个单独的操作,我可以在程序结束时执行该操作,如下所示: // first establish a delegate to collect everything we need to de-register later OnDestroy private delegate void Dreg()

好的,我正在为事件驱动的多委托执行使用公共静态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”来清除所有注册。到目前为止,这台机器运转良好

我的问题是:我能否更优雅地将这两条语句包装成一个函数,这样我只需要发出一条语句而不是两条?我已经试过了,但我的作业失败了。 我的实验是这样的:

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
}

在应用程序末尾运行某个程序如何帮助解决内存泄漏问题?
我给MyEvents分配的“thingToAdd”类型实际上是什么。SomeEvent
您没有向我们显示您实际声明该事件的代码,因此->我们无法说出它的类型
这似乎是不可能的。
。。我不明白为什么不应该。。是什么让你得出这个结论的?@Ruzihm:看了这个,真是多谢了!:-)我读过几篇文章,讨论了如果保留任何引用,显式命名多播代理,GC如何无法释放内存。所以,从我有限的理解来看,我想确保我取消了所有的注册。@derHugo:还有很多thx,感谢您的帮助。:-)你给我指出了正确的方向,告诉我这应该是可能的,并且还想看看处理程序的定义。事实证明,处理程序定义和委托分配之间的参数数量不匹配。修复后,它现在正在工作:-D