![](/img/trans.png)
[英]How do I avoid memory leak in Unity when subscribing to c# event in referenced serialized ScriptableObject?
[英]Would subscribing to my own C# event create a memory leak?
如果一個基類發布一個 C# 事件並且一個派生類訂閱它——即訂閱它自己——。 事件訂閱會阻止對象被垃圾回收嗎? 或者垃圾收集器是否足夠聰明以檢測這種循環引用情況。
乍一看,似乎應該如此,但我很確定我已經看到了執行此操作的控制代碼。 這是一個如此基本的問題,我不敢相信我以前從未研究過它。
編輯:對於 Juan R。我的意思是這樣的。 (從來沒有編譯過這段代碼,只是在我的頭頂輸入它,所以我可能有錯別字/錯誤)
public class Base
{
event EventHandler<double> ValueChanged;
}
public class Derived : Base
{
public Derived()
{
// Will this prevent my object from being collected?
ValueChanged += OnValueChanged;
}
private void OnValueChanged(object sender, double v) =>
{
}
}
訂閱其自身事件的對象不會導致內存泄漏,原因很簡單,即 CLR GC 基於可達性,而不是引用計數。 如果對象可以從 GC 根訪問,那么它無論如何都不符合 GC 的條件。 如果它不可訪問,則自引用不會使其可訪問。 關於GC 循環引用的事件沒有什么特別之處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.