由于未释放 ViewModel 而导致 MvvmCross 内存泄漏?

标签 mvvm memory-leaks xamarin xamarin.android mvvmcross

我有一个简单的项目 MvvmCross+Xamarin.Android
我正在使用标准 MvvmCross 导航来显示下一个 View 。

假设有两个具有相关 ViewModel 的事件:第一个,第二个。
设想:

1. start the - FirstViewModel is displayed
2. go to SecondViewModel
3. press the hardware back button

结果,我让两个 ViewModel 都在后台工作(基于弱信使事件和强信使事件)。
如果我想停止它,我可以调用 GC.Collect。

我在这里有两个选项可以正确收集我的 View 模型,并且我都担心:
1. use messenger + weak references
2. use messenger + strong references

弱引用 基于事件的事件对我不起作用,因为即使对于 ACTIVE ViewModel(绑定(bind)到当前显示的 View ),我也可能会丢失订阅。这将导致我的视​​图在没有收到基于订阅的事件时进入状态,并且我的 ViewModel 将不会响应后台服务(如传入消息)

强引用 基于方法的事件效果更好,但在这种情况下,我:
1. have to control manually moment when to subscribe/unsubscribe to events
2. have to make sure that I always unsubscribing from events on View deactivation/destroy
3. it seems that I also have to implement 4 methods and call it from native code on view activated/deactivate, created/destroyed.
  • 我有正确的假设吗?
  • 有没有关于如何处理的建议
    这以更可靠的方式?

  • PS:在 MvvmCross SDK 中实现这些方法可能会更好,只要我们从基础 MvvmCross 类(MvxActivity、MvxViewController)继承我们的所有 View ,它就会自动连接起来。

    PPS:我确实读过 this post我仍然认为它应该在 SDK 级别的某个地方实现

    您可以在此处下载示例项目:
    xLeak Source Code

    最佳答案

    Weak references based events don't really work for me because I could lost my subscriptions even for ACTIVE ViewModel (which is bound to the View currently displayed). That will cause my view to get into state when no subscription based events will be received and my ViewModel will not be responsive to Services in background (like incoming messages)



    这是不正确的。

    在使用从 Messenger 到 ViewModel 的弱引用的情况下,ViewModel 仍将被其 View 强引用 - 因此在它仍然是事件 View 时不会被垃圾收集。

    ps: probably it is better to implement those methods in MvvmCross SDK and as long as we inherit all our view from base MvvmCross classes (MvxActivity, MvxViewController) have it wired up automatically.



    如果您有任何建议,您可以随时:
  • 创建附加程序集和 nuget 包
  • 创建 GitHub 问题提议或 Pull Requests 实现建议
  • 关于由于未释放 ViewModel 而导致 MvvmCross 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27008035/

    相关文章:

    java - 为什么在 Android 中使用 Activity 的简单示例会导致内存泄漏?

    JavaScript 关闭内存泄漏

    java - SQLite 连接对象泄露 - Android

    ios - 在 iOS 模拟器上解析 float 失败

    c# - Android 上的数据 GridView

    data-binding - MVVM:当我更改对象本身时,如何通知每个对象属性的更改?

    android - 使用 RxJava 改造来自 View 模型的响应以在 fragment 中观察

    c# - Xceed DataGrid 设置为行 :MultiSelect - How to bind selected row to its MVVM row data

    android - 如何知道抽屉导航是否在 Xamarin 中打开?

    c# - 在XAML中将CollectionViewSource与CompositeCollection结合使用