Xamarin.Forms中给MainPage赋值new Page()是否会销毁旧页面?
问题解答
在Xamarin.Forms开发中,执行MainPage = new Page();替换根页面时,框架不会自动对旧的原页面执行Dispose销毁操作。
Xamarin.Forms的Page类型虽然实现了IDisposable接口,但替换MainPage的逻辑仅会将新页面设置为应用的根渲染页面,不会主动处理旧页面的销毁逻辑,原因是框架无法判定开发者后续是否还会复用该旧页面实例(比如后续重新赋值回MainPage、存入缓存队列二次使用等场景)。
旧页面实例只有在不存在任何活跃引用时,才会被.NET垃圾回收器标记回收,且垃圾回收过程也不会自动调用Dispose方法,所有非托管资源的释放逻辑都需要手动触发。
推荐处理方案
- 替换MainPage前主动获取旧页面实例,手动调用
Dispose()方法,同时需要提前手动取消页面内的事件订阅、释放原生控件绑定、关闭数据库连接等非托管资源占用,避免出现内存泄漏 - 如果项目中使用Shell作为根容器,仅替换Shell内部导航栈页面的场景遵循Shell的生命周期管理规则,但直接替换
Application.Current.MainPage的逻辑仍符合上述说明,需要手动处理旧页面销毁 - 可通过Xamarin Profiler工具跟踪页面对象的内存存活状态,排查未正确释放的页面实例问题
内容的提问来源于stack exchange,提问作者praveena H M
相关产品推荐
相关产品推荐

