`
lovnet
  • 浏览: 6707297 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

事件导致的内存泄露及Weak Event Pattern

阅读更多

事件绑定的背后

当事件接收受对象的订阅源对象的某个事件时:

oneControl.EventFired += anotherControl.OneControl_EventFired

会生成一个事件源对象到事件接收对象的强引用

内存泄露的原因

源对象的生命长于接收对象的生命(程序预期的生命), 且没有取消事件订阅:

oneControl.EventFired -= anotherControl.OneControl_EventFired

那么只要源对象未被"垃圾回收",由于那个强引用的存在,垃圾回收器也不会回收那个接收对象,即使它已经不再需要 - 内存泄露了!

那么避免泄露的办法就是- 记得及时取消事件订阅!但有些情况下,不知事件接收对象何时"不再需要",也就没办法去取消事件订阅。比如Silverlight中的Page控件还没有Closing, Closed事件,当一个Page不再需要时,并没有明显的时机去取消它所订阅的事件。

Weak Event Pattern

一个弱引用,表示即使它引用了一个对象,垃圾回收扔可回收该对象(只要该对象符合被回收的条件) - WeakReference

根据以上WeakReference对象的特点,通过一个弱引用对象来订阅事件,就不用担心忘记或无合适时机取消事件订阅而导致的内存泄露。这就是Weak Event Pattern的由来, WPF中提供了该模式的一种实现

Silverlight (目前最新是 4.0) 中还未提供类似的WPF类,Delay的WeakEventListener 提供了一种实现可供使用

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics