由于未处理ViewModels,MvvmCross内存泄漏?

时间:2014-11-19 02:42:38

标签: mvvm memory-leaks xamarin xamarin.android mvvmcross

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

假设有两个相关ViewModel的活动:第一个,第二个。 情形:

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

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

我在这里有两个选项可以正确收集我的视图模型,并且我有两个问题:

1. use messenger + weak references
2. use messenger + strong references

基于弱引用的事件对我来说并不真正有用,因为即使对于ACTIVE ViewModel(绑定到当前显示的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)继承所有视图,它就会自动连接。

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

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

1 个答案:

答案 0 :(得分:1)

  

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

这是不正确的。

如果使用从Messenger到ViewModel的弱引用,那么ViewModel仍然会从其View强引用 - 所以当它仍然是活动视图时它不会被Garbage Collected。

  

ps:可能最好在MvvmCross SDK中实现这些方法,只要我们从MvvmCross类(MvxActivity,MvxViewController)继承所有视图,它就会自动连接。

如果您有建议,可以随时:

  • 创建附加组件和nuget包
  • 创建GitHub问题提议或实施建议的请求