跳转至

WeakReferenceMessenger & StrongReferenceMessenger

什么是 WeakReference?

在说 WeakReferenceMessenger 之前,我们先要搞清楚什么是弱引用(WeakReference)。

在 C# 中,我们可以通过 new WeakReference(obj) 来创建一个弱引用,这个弱引用会指向 obj,但是不会阻止 obj 被 GC 回收。

var obj = new object();
var weakReference = new WeakReference(obj);

这一特性在 MVVM 中显得尤为重要。因为我们如果想要借助 Messenger 来实现 MVVM 中的消息传递,那么我们就需要在 ViewModel 中注册事件。一旦我们没有及时取消注册,那么这个 ViewModel 就无法被 GC 回收,这就会导致内存泄漏。而使用 WeakReferenceMessenger 就可以避免这个问题。

WeakReferenceMessenger

前面的例子中,我们使用 WeakReferenceMessenger.Default 来获取一个默认的 WeakReferenceMessenger 实例。这个实例是一个单例,我们可以在任何地方使用它。如果我们的项目比较简单,比如不需要考虑其他 Messenger 类型,且不使用 IoC 容器,那么我们可以直接使用这个单例。

StrongReferenceMessenger

它与 WeakReferenceMessenger 的唯一区别在于,它使用强引用,因此消息接收者不会被 GC 回收。在用法上,它与 WeakReferenceMessenger 没有区别,因此不再赘述。

但是,在使用传统的强引用时,我们需要注意内存泄漏的问题。我们需要在代码中合适的位置调用 Unregister 方法,以取消注册。

评论