微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐