为什么人们不在 Xamarin 中使用对象池?

Why don't people use object pooling in Xamarin?

我是移动开发的新手,而且是 Xamarin.我一直注意到的一件事是,每次加载页面时,人们总是请求创建一个 new page(),而不是拥有一个池或设置他们可以访问的页面列表。

这不会导致内存问题吗? Xamarin 是否会自动从范围中删除旧页面?对不起,如果这听起来像一个愚蠢的问题,但它让我失望,因为我作为程序员的第一直觉通常是限制内存中不必要的数据重复。

Xamarin 是基于 .NET 的技术,因此内存管理基于垃圾收集。因此,如果您遵循良好做法,您生成的不再需要的页面应该在某个时候被垃圾收集。

这是个好问题。如果页面导航有内存泄漏,可以先看看this document

The NavigationPage class provides a hierarchical navigation experience where the user is able to navigate through pages, forwards and backwards, as desired. The class implements navigation as a last-in, first-out (LIFO) stack of Page objects.

所以当你浏览页面时,你可以看到所有的页面都在堆栈上。简而言之,xamarin 在压入堆栈时在内部处理它们的内存释放。

如果您仍然担心内存泄漏,可以参考Xamarin.Forms App Lifecycle根据页面生命周期结束手动释放对象。

关于在返回堆栈时显式调用垃圾收集器

这是一个有争议的问题。有人说你永远不应该明确地调用垃圾收集器。而且,总的来说,我会同意这一点。但是,在 Xamarin 中,对 GC.Collect() 的魔法调用可能会出现问题。如果没有其他帮助,只需在调用 await _navigation.PopAsync(true) 后立即调用 GC.Collect(); .