【问题标题】:Swift iOS memory usage increasing during runtimeSwift iOS 内存使用量在运行时增加
【发布时间】:2020-05-23 10:44:16
【问题描述】:

当我启动应用程序时,它会检查用户当前是否已登录。如果没有,则将根视图控制器设置为他们可以注册或登录的登录页面。如果他们已登录然后它将根视图控制器设置为包含三个视图控制器的选项卡栏控制器的实例。

guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(frame: UIScreen.main.bounds)
if let user = Auth.auth().currentUser {
    window?.rootViewController = TabBarController()
    window?.makeKeyAndVisible()
    window?.windowScene = windowScene
    print("\(user.email ?? "user") is already logged in")
} else {
    let landingPageVC = LandingPageViewController()
    window?.rootViewController = landingPageVC
    window?.makeKeyAndVisible()
    window?.windowScene = windowScene
}

由于某种原因,当我启动应用程序(在这种情况下我已登录)时,应用程序显示一个空白屏幕,我可以在调试导航器中看到该应用程序似乎卡在分配内存的循环中。几分钟后,应用程序崩溃并在控制台中打印

来自调试器的消息:因内存问题而终止

我使用 Instruments 来观察是否存在内存泄漏,但它只显示绿色刻度并表示没有内存泄漏。我已经清理了我的构建文件夹,并从我的手机中删除了构建,但问题仍然存在。

【问题讨论】:

  • 它看起来像你项目中的某个无限循环。如果这仅在您登录时发生,那么我将在项目的“登录”部分中搜索这个无限循环 - 从 TabBarController 到每个 VC 您的 TabBar 包含的内容。
  • @Virender 我看不到我的视图控制器布局,它只显示一个空白的白屏
  • @LukášMareda 因此,当我从 HomeViewController 的标签栏中删除第一个视图控制器时,它似乎一切正常。白屏不再显示,我可以与应用程序交互,内存使用量不再增加。我应该寻找什么导致这个无限循环?
  • “HomeViewController”看起来有问题。我可以帮助你,前提是我看到里面有什么。
  • 在此处发布您的HomeViewController 代码。问题出在某个地方。你有for-loop吗?

标签: ios swift instruments


【解决方案1】:

配置文件内存分配

我制作了一个测试 iOS 应用程序来展示如何分析内存分配。创建新的 iOS 项目后,我将以下内容添加到 AppDelegate

var test: [String] = []

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    while true {
        test.append("blasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdfblasdgpjsogfisogfihsofighäkneäijifdf")
    }
    return true
}

这应该模拟您的问题。然后我们长按构建按钮并选择配置文件。

我们选择 Allocations 作为分析模板。

我们按下录制按钮。

我们再次选择分配。

我们选择调用树。

可能我们已经在右侧找到了有问题的堆栈跟踪。

或者你自己扫描调用树。

这应该为您提供进一步调试以找到无限循环的起点:)

【讨论】:

  • 我发现内存增加与 UITableViewCell 在没有重用标识符的情况下被初始化直接相关。我仍然不知道它为什么会循环,但是通过您提供的详细过程,我能够找到解决我的具体问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多