自己处理事件会防止实例被垃圾回收吗?

3
我阅读了这个问题的回答 Do event handlers stop garbage collection from occuring?,但如果发布者是目标会发生什么呢?
具体来说,我正在为一个WPF应用程序使用MVVM设计。Model-View类在每次更改时引发NotifyPropertyChanged事件。在某些类中,当某些内容被修改时,我需要调用一个方法。
我想要做到这一点:
this.PropertyChanged += this.MyHandler;

这些实例会被垃圾回收器销毁吗?

为什么不直接重写OnNotifyPropertyChanged方法呢? - Daniel Brückner
3个回答

8

垃圾回收器会检查并查看应用程序是否有对该对象的引用。它足够聪明,可以处理像上面那个循环引用的情况。

此外,它还足够聪明,可以处理以下情况:当你有两个对象A和B时:

A.Event += B.Handler; 
B.Event += A.Handler;

如果 A 和 B 都超出了作用域,垃圾回收器会智能地找到并清理这两个对象,即使它们相互订阅。然而,如果一个单独的对象(正在使用中)引用其中任何一个对象,它将阻止两者都被回收。
与引用计数方案相比,这是真正 GC 解决方案的主要优势之一。引用计数将无法收集此类对象,但.NET 的垃圾回收功能可以完美处理。

2

是的,GC会清除该对象,因为没有外部对象引用它。

GC获取所有在根级别(静态字段、每个线程堆栈上的引用等)持有的引用,并跳转到这些引用可能引用的对象,然后到这些对象可能引用的对象,依此类推。在此过程中,它将每个对象标记为“不可收集”。一旦它浏览完它们,任何尚未标记为“不可收集”的东西都可以被收集。

当您按照此方式进行操作时,GC无法从根访问到您的对象,因此它将被收集。


1

是的,它会。垃圾回收器足够智能,可以确定循环引用并收集涉及的对象。

它甚至可以处理多个对象,因此如果objectA正在侦听objectB上的事件,并且objectB正在侦听objectA上的事件,只要它们都没有其他引用,GC就会发现它可以一起收集它们。

(我能快速找到的最佳参考资料是另一个SO问题here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接