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

自处理事件是否阻止对实例进行垃圾收集?

  •  3
  • rockeye  · 技术社区  · 17 年前

    我读了问题的答案 Do event handlers stop garbage collection from occuring? 但当发布者是目标时会发生什么?

    更具体地说,我正在为WPF应用程序使用MVVM设计。模型视图类在每次更改时引发一个notifypropertychanged。在某些类中,我需要在修改某些内容时调用一个方法。

    我想这样做:

    this.PropertyChanged += this.MyHandler;
    

    GC会销毁这些实例吗?

    3 回复  |  直到 17 年前
        1
  •  8
  •   Reed Copsey    17 年前

    GC检查并查看对象的任何引用当前是否在应用程序中根目录。它足够聪明,可以处理像上面那样的循环引用。

    此外,它足够智能地处理有两个对象的情况,即A和B,以及:

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

    如果A和B都超出了范围,那么GC就足够智能地查找和清除这两个对象,即使它们彼此订阅。但是,如果一个单独的对象(正在使用)引用其中一个,它将阻止收集这两个对象。

    与参考计数溶液相比,这是真正的GC溶液的主要优点之一。引用计数将无法收集此数据,但.NET GC将完美处理此数据。

        2
  •  2
  •   AnthonyWJones    17 年前

    是的,GC将清理对象,因为引用它的对象没有外部的内容。

    GC获取根级别的所有引用(静态字段、每个线程堆栈上的引用等),并从这些引用跳转到这些引用可能引用的对象,然后跳转到这些对象可能引用的对象,依此类推。它将每个对象标记为“不收集”。一旦它咀嚼过它们,任何还没有标记为“不可收集”的东西都会被收集起来。

    当您遵循这一点时,GC无法从根目录访问您的对象,因此将收集它。

        3
  •  1
  •   Community Mohan Dere    9 年前

    是的,GC足够智能,可以确定循环引用并收集涉及的对象。

    它甚至可以在多个对象上处理它,因此如果objecta正在监听objectb上的一个事件,而objectb正在监听objecta上的一个事件,如果它们都没有被引用,那么gc将发现它可以将这两个对象收集在一起。

    (我能很快找到的最好的参考是另一个问题,所以 here )