代码之家  ›  专栏  ›  技术社区  ›  Kari

Unity3D协同程序和lambda回调,安全

  •  1
  • Kari  · 技术社区  · 6 年前

    调用在协同过程中声明的System.Action是否安全?

    IEnumerator MyCoroutine(){
         bool myBool = true;
         System.Action action = ()=>{myBool=false;}
    
         StartCoroutine (MyOtherCoroutine(action));//just launch and forget about it
     }
    
     IEnumerator MyOtherCoroutine(System.Action dangerous_callback){
         yield return null;
         yield return null;//skip several frames
         yield return null;
         dangerous_callback.Invoke();//will cause problems? The owner coroutine (and it's myBool) is no longer on stack
     }
    

    我担心的是 myBool 在第一次联程中分配的。 MyCoroutine MyOtherCoroutine 完成。我可以看到那个系统。操作不会被收集,因为它确实仍然被引用 肌球蛋白 支原体

    1 回复  |  直到 6 年前
        1
  •  3
  •   Programmer    6 年前

    但这似乎是一个可能的内存泄漏,这可能是不可能的 以后再看?只是问用它是否合适。

    . 这样做是完全可以的,如果您需要在协程函数中使用回调函数,就需要这样做。请记住,这是C语言,在C语言中创建内存泄漏比使用C++更困难,除非你滥用Unity的API,这些API可能在本地(C++)方面造成内存泄漏,但这里不是这样。

    不过,你应该检查一下 Action null 否则,在调用它之前,请先考虑代码中的一些问题。

    if (dangerous_callback != null)
        dangerous_callback.Invoke();