我写了UWP,但这也可以在IOS上安装Android,因为我只使用VS2017分析了UWP应用程序。
创建问题的步骤。 - 打开VS 2017并通过选择选项卡式页面或masterdetail页面启动新的xamarin表单项目。无需编写任何单一代码。
问题;
第一个快照是在加载应用程序之后。
在选择列表中的项目并导航到ItemDetailsPage
导航回ItemsPage
Expections; 在第3张快照上看不到ItemDetailsPage,因为我正在导航回来,这个页面会从导航堆栈中弹出。所以它应该被移除,由GC收集或处置。
以下是第3个快照详情;
我是否读错了这个快照或者xamarin表单应用程序有什么问题?
编辑:屏幕截图下方还有“检测到周期”的统计信息。那是什么意思?我以为循环会导致内存泄漏,不是吗?
答案 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)时,会发生相同的内存泄漏。有没有人遇到这个问题