首页 > 解决方案 > 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 的一种方式

我的问题是,如何防止这种行为并让我的应用程序在登录后直接使用更少的内存。我的视图切换方法是否不好?

谢谢你的帮助!

标签: iosswiftswiftui

解决方案


它可能与您的内存问题无关,但您不需要 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.


推荐阅读