我阅读了问题Do event handlers stop garbage collection from occuring?的答案,但是当发布商成为目标时会发生什么?
更具体地说,我正在为WPF应用程序使用MVVM设计。 Model-View类会在每次更改时引发NotifyPropertyChanged。在某些类中,我需要在修改某些内容时调用方法。
我想这样做:
this.PropertyChanged += this.MyHandler;
这个实例会被GC破坏吗?
答案 0 :(得分:8)
GC查看并查看对象的任何引用当前是否已根植于应用程序中。它足够聪明,可以像上面那样处理循环引用。
此外,它足够聪明,可以处理你有两个对象A和B的情况,并且:
A.Event += B.Handler;
B.Event += A.Handler;
如果A和B都超出范围,那么GC足够聪明,可以找到并清除这两个对象,即使它们相互订阅。但是,如果一个单独的对象(在使用中)引用任何一个,它将阻止两者被收集。
与参考计数解决方案相比,这是真正的GC解决方案的主要优势之一。引用计数将无法收集此信息,但.NET gc将完美地处理它。
答案 1 :(得分:2)
是的,GC会清理对象,因为引用它的对象没有任何外部信息。
GC获取在根级别保存的所有引用(静态字段,每个线程堆栈上的引用等),并从这些引用跳转到这些可能引用的对象,然后跳转到这些对象可能引用的对象,依此类推。因此,它将每个对象标记为“不被收集”。一旦它穿过它们,任何尚未标记为“不被收集”的东西都可以收集。
当你遵循这一点时,GC无法从根目录到达你的对象,因此它将被收集。
答案 2 :(得分:1)
是的,GC足够聪明,可以确定循环引用并收集相关对象。
它甚至可以在多个对象上处理它,所以如果objectA正在侦听objectB上的事件,而objectB正在侦听objectA上的事件,前提是它们都是未引用的,GC会发现它可以一起收集它们。
(我可以快速找到参考的另一个SO问题here)