gpt4 book ai didi

ios - 我的 iOS 应用程序被踢出挂起状态的速度太快了。我不知道是什么在后台占用 CPU

转载 作者:可可西里 更新时间:2023-11-01 04:46:45 24 4
gpt4 key购买 nike

我需要帮助来弄清楚我的应用程序在后台执行了哪些代码。如果我在我的应用程序的 Instruments 中运行 Activity Monitor,即使在我按下主页按钮后,它也会持续使用大约 1% 的 CPU。

我假设这会导致 iOS 在 backgroundTimeRemaining 过期后立即将我的应用踢出暂停状态。即使在屏幕上显然没有任何事情发生,该应用程序仍会占用 CPU 时间并被踢出挂起状态,即使我只是让手机休眠几分钟也是如此。

我已经完成并在我的应用程序中对 NSTimers 进行了项目范围的搜索,以确保在我离开应用程序后没有任何东西被触发,并在应用程序接收网络消息的常用位置放置断点,但似乎没有受到任何打击。

我已经确认,当它未连接到调试器时,这种情况仍然会发生,并且当我按下主页按钮时,其他应用程序的 CPU 利用率似乎变为 0 或更接近于 0。

什么工具可以帮助我实现我的目标并找出后台运行的代码?

编辑 1:在 Petesh 的评论之后,我在 Instruments 中更多地使用了 Time Profiler,发现我可以设置 Inspection Range 并在我将应用程序放入暂停状态。我发现了一些不应该运行的代码并修复了它,但几分钟后应用程序仍然被踢出挂起状态!

当应用程序处于后台时,事件监视器现在仅显示 0.1-0% 的 CPU 使用率。再次运行 Time Profiler 显示唯一运行的是我认为的主运行循环。在后台大约一个小时的时间里有 277 毫秒。如果我选中“Invert Call Tree”框,它会显示时间主要花在 mach_msg_trap 上,在那一小时内总共花费了 46 毫秒。我不确定这是否是正常行为。

我已经解决了部分问题,但最重要的部分仍然存在。是什么阻止我的应用保持暂停状态?

编辑 2(已修复!):经过更深入的挖掘,我找到了罪魁祸首。第三方库正在调用 beginBackgroundTaskWithExpirationHandler:,然后在完成时从未调用 endBackgroundTask:。因此,我相信 iOS 认为该应用程序仍在尝试执行后台任务,并且在一定的后台时间结束后它只是终止了该应用程序,即使它实际上并没有做任何事情。

Instruments 中的事件监视器现在在初始后台代码运行后的整个时间内真正显示为 0%。

自从我第一次问这个问题以来,我不确定这只是这个问题还是我修复的所有问题的组合,但不管怎样,它已经修复了!

编辑 3:经过更多研究后,我发现这实际上不是第三方库的错。该库正在监听 applicationDidEnterBackground 通知,因此它可以刷新它的队列。但是在我们自己的 applicationDidEnterBackground 中,我们也对队列进行了强制刷新。因此它试图启动后台任务两次并且只完成一次。糟糕!

最佳答案

如果您通读了对原始问题的所有编辑,您可以看到详细信息和我解决问题的思路,但我写这个答案是为了让人们了解主要内容。

要找出是什么在后台占用 CPU:只需使用 Instruments Time Profiler 中的 Inspection Window。我能够准确地将我需要的部分归零。然而,这实际上并没有帮助弄清楚为什么我的应用程序被提前终止。

要找出我的应用被终止的原因:真正的答案就在眼前。我只需要在有后台处理程序的地方逐步执行所有代码。对于 beginBackgroundTaskWithExpirationHandler: 的每次调用,都需要对 endBackgroundTask: 进行相反的调用。

在我的案例中,还有一些 Unresolved 问题。我想在 Instruments 中运行更多的内存分析,以确保我的应用程序可以在运行多个应用程序的情况下更长时间地保持挂起状态。但这可能是一个永无止境的过程,因为您永远不会真正知道该阈值的确切位置。

关于ios - 我的 iOS 应用程序被踢出挂起状态的速度太快了。我不知道是什么在后台占用 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com