`
lovnet
  • 浏览: 6722056 次
  • 性别: 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 提供了一种实现可供使用

分享到:
评论

相关推荐

    Swift开发必备技巧:内存管理、weak和unowned1

    Swift开发必备技巧:内存管理、weak和unowned1

    WeakEvent:通用弱事件实现

    弱事件 事件是.NET应用程序中最常见的内存泄漏源:除非您取消订阅事件,否则订阅者的生存期将延长至发布者的生存期。 那是因为发布者通过委托维护了对订户的强烈引用,从而防止了订户的垃圾回收。 该库提供了一个...

    Patterns:安全属性和事件

    WeakEvent类是内存泄漏安全的。 两种实现都支持事件限制。 有关更多信息,请参见项目中的测试。 例子: public Event<EventArgs> MyEvent = new Event(); MyEvent.Subscribe(...callback...) MyEvent....

    ARM 之十一__weak 代码 WEAK.7z

    博文 ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用 的测试代码,备用!

    weak 决策树训练及测试应用步骤

    weak 对决策树算法的实际应用 有训练和测试两部分,如果你是数据挖掘的新手,那么这个文档会告诉你如何使用weka用于实际的算法进行挖掘,保证让你满意

    weak galerkin finite element meathods on polytopal

    weak galerkin finite element meathods on polytopal

    weak操作入门(数据挖掘)

    让你轻松掌握weka操作方法,以便进行数据挖掘,这是简单介绍怎么使用这个软件的一个文档

    The strength of weak learnability.pdf

    The strength of weak learnability.pdf

    函数weak属性理解_弱声明实例

    学习理解函数加上weak后的变化

    Weak-Password.zip

    压缩包包含了常见的弱口令用户名,弱口令密码。包含常见的服务ftp、telnet、mysql等。还有sql注入测试代码。

    Practical Weak Supervision.pdf

    但是,手工构建训练集既耗时又昂贵,导致许多公司的ML项目尚未完成。还有一个更实际的方法。在这本书中,Wee Hyong Tok, Amit Bahree和Senja Filipi向您展示了如何使用弱监督学习模型创建产品。 您将学习如何使用...

    Carrier loop architectures for tracking weak GPS signals.pdf

    Carrier loop architectures for tracking weak GPS signals.pdf, The performance of various carrier recovery loop architectures (phase lock loop (PLL), Doppler-aided PLL, frequency lock loop (FLL), and ...

    weak应用程序,数据挖掘平台

    用户可以直接使用这个平台,给大家带来了方便.

    Weak Signal Digital GNSS Tracking Algorithms.pdf

    9、Weak Signal Digital GNSS Tracking Algorithms 10、Fundamentals of Global Positioning System Receivers II 11、Composite GNSS Signal Acquisition over Multiple Code Periods 12、GPS接收机电路设计 13...

    weak,Strong指针小结

    ARC的判断准则: 只要没有强指针指向对象,就会释放对象,弱指针不会这样,及时有弱指针指向对象,对象没有强指针指向,也会自动释放掉。一般,无需显式声明为强指针,但是在封装里,定义方法的时候需要写明。...

    matlab有些代码不运行-Polyphonic-Sound-Event-Detection-with-Weak-Labeling-Datas

    声音事件检测,带有/不存在标签(第3.2章) 启用/不存在标签的声音事件检测(第3.3章) 在子集上按顺序标记的声音事件检测(第4章) 先决条件 硬件: GPU 大容量存储(建议1 TB) 软件: Python 2.7 PyTorch(我使用...

    C++仿写指针指针(auto-ptr,unique-ptr,shared-ptr,weak-ptr)

    对象都存在于栈上,那么创建出来的对象在出作用域的时候(函数或者程序结束)会自己消亡,所以在这个**类中的析构函数中写上delete**就可以完成智能的内存回收,避免忘记释放指针指向的内存地址造成内存泄漏。...

    iOS 中weak的实现代码示例

    weak 属性关键字就是弱引用,它不会增加引用计数但却能保证指针的安全访问,在对象释放后置为 nil,从而避免错误的内存访问。主要为了解决循环引用的问题。 接下来,我们会从 objc 库中的 NSObject.mm、 objc-weak....

    Inversion arrangements and the weak Bruhat order

    逆序超平面排列与弱布吕阿序,范久瑜,,对每个排列$w$,我们可以根据$w$的逆序构造一个超平面排列$mathcal{A}_w$,称为$w$对应的逆序超平面排列。$mathcal{A}_w$中区域的个数小于等于在

    GNSS Receivers for Weak Signals

    有关GPS接收机的一本书,主要针对弱信号,找了好久才下到,就是公式有点多

Global site tag (gtag.js) - Google Analytics