![](/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.