内存中的多个视图和视图模型实例

时间:2014-06-24 16:46:51

标签: windows-phone-8 mvvm memory-leaks mvvm-light

我们有一个Windows Phone 8应用程序,我们正在使用具有四个,五个视图和大约相同数量的视图模型的mvvm灯。有一天,我们观察到应用程序的大小随着使用而增加,最终达到100 mb以上并最终崩溃。经过大量测试后我们能够理解的是,每次我们导航到视图时,它的实例都会被创建并且存储在存储器中。观察到视图和视图模型的所有实例都存在于存储器中,从而增加了RAM上的空间。我们还通过在视图类和视图模型上定义finializer来确认相同的内容,在关闭应用程序时,调用finializer与页面导航到的次数完全相同。我们将视图的datacontext绑定到xaml中的相应视图模型。其中一个主视图有一个广告控件,因此如果用户多次导航到该视图,则大小会非常快。如何解决此问题。我无法理解的是,一旦用户按下后退按钮,视图应该被销毁,但这不会发生。任何帮助将非常感激。

3 个答案:

答案 0 :(得分:1)

我们通过在代码后面添加以下代码行找到了解决方案。

protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        Messenger.Default.Unregister(this);

        if (e.NavigationMode == NavigationMode.Back)
        {
            DataContext = null;
        }
    }

我们上面所做的是我们取消注册页面的所有消息处理程序并将DataContext指定为null。在我们的例子中,datacontext仅在xaml中分配,而messenge处理程序在页面的OnNavigatedTo事件中注册。但是仍然不清楚在从页面导航回来时,页面对象应该自动死亡。如果将这行代码添加到所有mvvm light项目页面中,如果是这样,那么为什么它不常见。

答案 1 :(得分:0)

您泄漏View内存的原因是因为您以某种方式从Views中订阅ViewModel的事件。要么将这些订阅重构为WeakEvent订阅,要么在OnNavigatedFrom中删除它们

答案 2 :(得分:-1)

使用IOC容器维护所有ViewModel的单个实例。

其中一个选项是使用MVVM Light附带的SimpleIoc。

Best tutorial to learn MVVMLight SimpleIoc