侦听事件可能会导致内存泄漏。侦听事件的一般方法是使用语言特定的语法,该语法将处理程序附加到源上的事件。例如,在 C# 中,该语法是:source.SomeEvent += new SomeEventHandler(MyEventHandler)。
实现 WeakEvent 模式主要是对于控件作者而言是很有趣味的。这是因为控件作者主要负责控件的行为和包容以及控件对其所插入到的应用程序的影响。这包括控件对象生存期行为,特别是对所描述的内存泄漏问题的处理。
- 从 WeakEventManager 类派生一个管理器。
- 在任何想要注册弱事件的侦听器的类上实现 IWeakEventListener 接口,而不生成源的强引用。
- 注册侦听器时,对于想要侦听器使用该模式的事件,不要使用该事件的常规的 add 和 remove 访问器,请在该事件的专用 WeakEventManager 中改用"AddListener"和"RemoveListener"实现。
表示弱引用,即在引用对象的同时仍然允许垃圾回收来回收该对象。
弱引用特别适合以下对象:占用大量内存,但通过垃圾回收功能回收以后很容易重新创建。
假设 Windows 窗体应用程序中的一个树视图向用户显示了复杂的选项层次结构。 如果基础数据量很大,则用户使用应用程序中的其他部分时,在内存中保留该树会导致效率低下。
当用户切换到应用程序的其他部分时,可使用 WeakReference 类来创建对该树的弱引用,并销毁所有强引用。 当用户切换回该树时,应用程序会尝试获得对该树的强引用,如果得到,就不必重新构造该树。
由于在 IsAlive 属性返回 true 之后,可能会立即通过垃圾回收来回收对象,也就是Target=null,因此不建议使用此属性(除非仅对 false 返回值进行测试)。 尽管这种概率很小。