事件导致的内存泄露及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 提供了一种实现可供使用

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值