Xamarin表单在UWP上是否有内存泄漏?

时间:2018-03-15 17:49:33

标签: xamarin.forms xamarin.ios xamarin.android xamarin.uwp

我写了UWP,但这也可以在IOS上安装Android,因为我只使用VS2017分析了UWP应用程序。

创建问题的步骤。   - 打开VS 2017并通过选择选项卡式页面或masterdetail页面启动新的xamarin表单项目。无需编写任何单一代码。

问题;

  • 第一个快照是在加载应用程序之后。

  • 在选择列表中的项目并导航到ItemDetailsPage

  • 之后,第二个选择了
  • 导航回ItemsPage

  • 后拍摄了第3张快照

enter image description here

Expections; 在第3张快照上看不到ItemDetailsPage,因为我正在导航回来,这个页面会从导航堆栈中弹出。所以它应该被移除,由GC收集或处置。

以下是第3个快照详情;

enter image description here

我是否读错了这个快照或者xamarin表单应用程序有什么问题?

编辑:屏幕截图下方还有“检测到周期”的统计信息。那是什么意思?我以为循环会导致内存泄漏,不是吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

  

在第3张快照上看不到ItemDetailsPage,因为我正在导航回来,这个页面从导航堆栈中弹出。所以它应该被移除,由GC收集或处置。

如果您尝试导航到不同的详细页面然后再回来拍摄快照,您会发现ItemDetailPage的数量为1。

有时,出于性能考虑,页面或资源等对象将被正确缓存和重用。如果您的页面包含大图像或资源,则应尝试手动处理它们以减少内存使用量。

更新

  

现在的问题是如何妥善处理它?在哪里这样做?我一直在阅读OnDissapearing方法,这对我来说并不安全,因为它可以在向前导航时调用,而不仅仅是在堆栈中导航。你的建议是什么?

如果您不想处置资源以进行导航,则可以在向前导航时定义状态参数,不要处置资源。例如:

bool forwardNavigating=false;
...
 protected override void OnDisappearing()
 {
    base.OnDisappearing();
    if (!forwardNavigating)
    {
        //dispose your resources
    }
 }
  

elow屏幕截图还显示有"周期检测到"。那是什么意思?我以为循环会导致内存泄漏,不是吗?

cycle detected表示:

  

对象可以引用直接或间接保存对第一个对象的引用的第二个对象。

请参阅Analyze .NET Framework memory issues的循环引用。

个人想法:

我不认为这是cycle detected方面的记忆问题。在某些情况下,当我们在其中时,我们可能需要访问父对象。因此,当父级仍在引用子级时,我们需要属性Parent。这在视图中发生了很多。我不知道分析仪是如何工作的,以及是否是我上面描述的情况。我想说的是cycle detected并不等于内存泄漏。

答案 1 :(得分:0)

在Xamarin ListView中动态更改BindingContext(通过设置null并重新分配新的视图模型来重置BindingContext)时,会发生相同的内存泄漏。有没有人遇到这个问题