ios - SwiftUI 内存管理
问题描述
我对 SwiftUI 比较陌生(现在大约 1 个月的编码)。我正在开发支持用户登录(电子邮件/facebook/google)的应用程序,重要的是,它为未授权用户显示登录/注册屏幕,为已登录用户显示应用程序的其余部分。当然,用户授权在应用程序启动。为了决定向用户显示哪个视图,我在 View 中编写了这样的代码,由 AppDelegate 启动:
struct StartingView: View {
@EnvironmentObject var appState: AppGlobal
// Use 1 for main app view and 2 if user needs to login or create an account
var body: some View {
ZStack {
if appState.presentedView == 1 {
// AppView not wrapped in NavigationView as NavigationView is inside already
AppView()
} else if appState.presentedView == 2 {
NavigationView {
LoginView()
}
}
}
}
}
当我启动我的应用程序并且我没有登录时,它需要大约 80 MB 的 RAM,并且在登录后 RAM 使用量增加到大约 130MB。
当我以已经登录的用户身份运行我的应用程序时,大约需要 60MB。我假设 LoginView 的某些部分在appState.presentedView
更改后仍然存在。MemoryGraph 没有显示任何内存泄漏(有时它显示单一类型的小泄漏,绝对不是 50MB)
如果我注销并返回 LoginView 应用程序内存使用几乎保持静止,所以看起来这种行为是 LoginView -> AppView 的一种方式
我的问题是,如何防止这种行为并让我的应用程序在登录后直接使用更少的内存。我的视图切换方法是否不好?
谢谢你的帮助!
解决方案
它可能与您的内存问题无关,但您不需要 ZStack 围绕您的if
块。
@ViewBuilder var body: some View {
if appState.presentedView == 1 {
// AppView not wrapped in NavigationView as NavigationView is inside already
AppView()
} else if appState.presentedView == 2 {
NavigationView {
LoginView()
}
}
}
如果你使用的是最新的 iOS/XCode,我相信你甚至可以放弃@ViewBuilder
.
推荐阅读
- vue.js - 嵌套路由未在路由器视图中呈现
- python - 如何使用 docx 从 python 列表中添加图像?
- python - 在列表中找到最大的重复数字序列
- .net-core - Signal-R 在接收到先前的调用数据后调用另一个服务器方法
- java - 为什么我的程序处理字符编码不正确?
- r - Find percentage exceedances by group in R?
- mysql - 在匹配行上使用递归连接选择
- javascript - navigator.clipboard.write : 'Clipboard': Iterator getter 不可调用
- ruby-on-rails - 在没有self.class.exists的Rails ActiveRecord中确保JSONB中嵌套值的唯一性?
- java - 升级 Gradle