Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon 弱事件模式与MVVMCross中的经典事件有何不同


弱事件模式与MVVMCross中的经典事件有何不同


MVVMCross(或任何.NET框架)中的弱事件模式和经典事件具有不同的目的,并且具有不同的实现,主要旨在管理内存泄漏和对象寿命。

##经典活动

.NET中的经典事件基于强烈的参考。当对象订阅另一个对象的事件时,会从事件源到订户创建强引用。这意味着,只要事件源对订户的参考文献,即使不再需要或在应用程序中其他地方引用订户,就无法收集订户。如果在不再需要的情况下未明确地从事件中明确取消订阅,则可能会导致内存泄漏。

在MVVMCross中,可以将经典事件用于视图模型和视图之间的通信,但是它们需要仔细的管理以避免记忆泄漏。例如,如果A ViewModel暴露了事件,并且视图订阅了该事件,则ViewModel将对视图有很大的参考,以防止其被收集到垃圾,直到明确删除订阅为止。

##弱事件模式

弱事件模式旨在通过使用弱参考而不是强烈的引用来防止记忆泄漏。当订户使用弱事件模式订阅事件时,事件源将对订阅者的参考较弱。如果订阅者不再在应用程序中的其他地方引用订户,即使没有明确取消事件中的订阅,也可以收集垃圾。

在MVVMCROSS中,使用弱事件可以通过确保ViewModels对视图的强烈参考来帮助维持干净的体系结构。这在内存管理至关重要的移动应用程序中尤其重要。 MVVMCROSS提供了诸如`fearsubscriber`之类的扩展程序,以促进弱事件的使用,从而使开发人员能够订阅事件而无需创建可能导致内存泄漏的强参考。

###实施和福利

实施弱事件通常涉及创建一种自定义机制,以使用“弱者”对象管理订阅。这种方法可确保如果不再需要订户可以收集垃圾,从而降低了记忆泄漏的风险。但是,由于需要在致电活动处理程序之前检查订户是否还活着,因此它也引入了其他复杂性和略有性能开销。

###缺点和注意事项

尽管弱事件模式有益于防止内存泄漏,但它具有一些缺点。实施可能比经典事件更复杂,并且存在不再使用但尚未收集垃圾的“僵尸”订户对象的风险。如果提出事件并执行僵尸订户的处理程序,则可能导致意外的行为或错误。

总而言之,MVVMCross中的薄弱事件模式与经典事件不同,通过使用弱参考来防止记忆泄漏并允许订阅者更容易收集垃圾。尽管它在内存管理方面具有重大好处,但它需要仔细实施和考虑潜在的缺点。

引用:
[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-event-in-wpf-with-with-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangery/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcrosshandbook/using-mvvmcross-cross-to-create-your-first-first-first-first-first-first-first-camarin-app/navigation/responding-the-evens-the-event--the-event-the-events-from-drom-different-controls-controls-controls-controls-controls-controls-controls-controls-inthe-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-to-wooid-nasty-nasty-memory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/wpf/weak-event/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-weak-vents