Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon MVVMCROSS如何确保垃圾收集到活动订阅


MVVMCROSS如何确保垃圾收集到活动订阅


MVVMCROSS确保主要通过使用弱参考来确保事件订阅的垃圾收集。这是关于其工作原理的详细说明:

MVVMCross Messenger的概述

MVVMCross Messenger插件旨在促进组件之间的事件聚合。它允许组件通过发布和订阅消息进行通信。 Messenger对事件订阅使用弱参考,这有助于通过允许垃圾收集器删除不再引用的对象来防止内存泄漏。

MVVMCross中的弱参考

当您使用MVVMCross Messenger订阅消息时,可以指定是使用弱或强引用。默认情况下,MVVMCross使用弱参考(`mvxReference.Weak`)进行订阅。这意味着Messenger没有对回调方法的强烈参考,如果订阅的对象不超出范围,则允许垃圾收集器删除订阅。

##订阅和未订阅

可以使用几种方法来管理订阅:
- 订阅:消息直接在发布线程上传递。
- 订阅:消息已被整理到主UI线程。
- 订阅ReadReadPoolThread:邮件已排队用于线程池处理。

每个订阅方法都返回一个“ mvxsubscriptionToken”,可用于取消订阅消息。但是,如果未存储令牌,则可以立即收集订阅。

##垃圾收集机制

MVVMCROSS中的垃圾收集机制依赖于``MvxSubscriptionTokentoken''是垃圾时收集的。如果未存储订阅令牌,它将有资格获得垃圾收集,这可能会导致事件处理程序的未取消订阅。这种方法可确保由于事件订阅而不必要地将对象保存在内存中。

##观察订阅状态

MVVMCROSS还提供了观察当前订阅状态的方法,例如“ Hassubscriptionsfor”和“ CountSubscriptionsfor”。此外,Messenger每当添加,删除或到期时发布`mvxsubscriberchangemessage`消息,允许组件根据当前的订阅状态调整其行为。

##记忆管理的最佳实践

确保有效的垃圾收集并防止记忆泄漏:
- 尽可能将弱参考用于事件订阅。
- 如果需要明确管理订阅,请存储订阅令牌。
- 在不再需要的事件时取消订阅,尤其是在使用强引用时。
- 避免对应收集垃圾的物体进行强有力的引用,例如查看模型或视图。

通过遵循这些实践并利用MVVMCross的弱订阅机制,开发人员可以帮助确保事件订阅不会阻止对象被收集到垃圾,从而在其应用程序中保持有效的内存管理。

引用:
[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-way-way-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-mono-droid-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-usion-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-never-garbage收费
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-anp-setup
[9] https://www.spicelogic.com/blog/net-event handler-memory-leak-16