首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MvvmCross内存泄漏是因为没有释放ViewModels?

MvvmCross内存泄漏是因为没有释放ViewModels?
EN

Stack Overflow用户
提问于 2014-11-19 02:42:37
回答 1查看 1.2K关注 0票数 2

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

假设有两个与相关ViewModels相关的活动:第一,第二。设想情况:

代码语言:javascript
复制
1. start the - FirstViewModel is displayed
2. go to SecondViewModel
3. press the hardware back button

因此,我让两个ViewModel都在后台工作(基于弱消息事件和强消息事件)。如果我想阻止它,我可以打电话给GC.Collect。

在这里,我有两个选择,可以正确地收集我的视图模型,我对两者都有关切:

代码语言:javascript
复制
1. use messenger + weak references
2. use messenger + strong references

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

强引用--基于方法的事件--效果更好,但在本例中我:

代码语言:javascript
复制
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中实现这些方法,只要我们从基类(MvxActivity、MvxViewController)继承所有视图,就可以自动连接这些方法。

PPS:我确实读过这个职位,我仍然认为应该在SDK级别实现它

您可以在这里下载示例项目:xLeak源代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-19 09:40:39

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

这是错误的。

在使用从Messenger到ViewModel的弱引用的情况下,ViewModel仍然会从它的视图中被强烈引用-因此在它仍然是活动视图时,它不会被垃圾收集。

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

如果你有建议,你可以:

  • 创建附加程序集和nuget包。
  • 创建GitHub问题,建议或撤回执行建议的请求
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27008035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档