【问题标题】:SwiftUI Memory ManagementSwiftUI 内存管理
【发布时间】:2020-11-28 20:51:35
【问题描述】:

我对 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 使用量增加到大约 130 MB。

当我以已登录用户的身份运行我的应用程序时,大约需要 60MB。我假设在 appState.presentedView 更改后,部分 LoginView 仍然存在。 MemoryGraph 不显示任何内存泄漏(有时它显示单一类型的小泄漏,绝对不是 50MB)

如果我注销并返回 LoginView 应用程序的内存使用几乎保持静止,所以看起来这种行为是 LoginView -> AppView 的一种方式

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

感谢您的帮助!

【问题讨论】:

  • 在 Xcode Debug Navigator 中进行登录后查看内存图形层次结构,您会发现内存中剩余的内容。然后你就知道应该清理什么了。
  • 我在第一个选项卡(以我的应用程序名称命名)下看不到任何值得关注的内容,所以我认为它必须更深入。有没有办法比较两个内存图?然后我就可以比较登录前后的内存状态了。
  • 这是正常的,不是问题。如果你看到的活动会导致记忆稳定增长并且永不缩小,那么这就是一个问题。但是您所描述的在 iOS 中并不少见。现代操作系统以非常不直观的方式分配内存,并且应用程序通常不会释放内存,直到系统中存在内存压力。要以有意义的方式准确确定应用程序实际使用了多少内存是非常困难的。重要的是内存使用量是随时间稳定增长还是稳定。
  • 已经开始在 Apple 上进行开发][+,并且在嵌入式开发中花费了大量时间,其中几 kB 是一笔财富,我很难理解一个我说“嗯...... 50MB?这很正常。”但我们到了。
  • @RobNapier,感谢您的回答。我还对我的应用程序进行了分析,并测试了视图更改的时刻。 XCode 没有标记任何内存泄漏,所以我想应该没问题。

标签: ios swift swiftui


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2011-07-21
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多