事件导致的内存泄露及Weak Event Pattern
2010-06-03 15:23
441 查看
事件绑定的背后
当事件接收受对象的订阅源对象的某个事件时:
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
提供了一种实现可供使用
当事件接收受对象的订阅源对象的某个事件时:
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
提供了一种实现可供使用
相关文章推荐
- WeakPropertyChangedListener用弱引用事件订阅防止内存泄露
- [转]如何解决事件导致的Memory Leak问题:Weak Event Handlers
- C#中的 .NET 弱事件模式 / The .NET weak event pattern in C#
- Handler当做内部类,导致内存泄露的问题
- weak_ptr 弱引用打破智能指针中循环引用造成的内存泄露
- 内存泄露导致的内存溢出
- HashMap存取过程中改变key值导致的内存泄露
- 误用kfree()释放skb导致内存泄露
- 解除dom循环引用导致的内存泄露
- UIImageView 加入子UIImageView 导致内存泄露的问题
- Flex 中可能导致内存泄露的地方
- printf("%s")导致内存泄露
- Android Handler当做内部类,导致内存泄露的问题解决方案
- AutoEventWireup="false"导致Page_Load事件未执行
- Android InputMethodManager 导致的内存泄露及解决方案
- 纪实:嵌入式Elasticsearch服务因为gc无法释放内存,导致宕机事件
- VC 2010的MFC函数,CMFCVisualManager::GetInstance()可能导致内存泄露
- 4000 C#之弱事件(Weak Event)的实现
- 关于initWithCoder导致的内存泄露