应用冻结,但 CPU 使用率随时间增加

App freezes but CPU usage increases over time

我已经在这件事上停留了好几个小时了,我不知道还能搜索什么。

我能提供的不多,因为调试器没有显示任何错误,但它是可重现的——我在 table 视图中点击一个非常具体的项目,该操作应该关闭该模式,然后我的应用程序冻结了。 table 视图中的其他项目不会发生这种情况——模态完全消失,应用程序继续运行。

我检查了 this answer 怀疑这是一个死锁,但是:

我该如何调试这个东西?我一直在查看 Xcode 仪器,但我无法理解所看到的数据。具体来说,系统跟踪模板似乎能够在冻结发生时立即停止,这与其他继续记录的模板不同。

添加:我在系统跟踪中看到的内容

Instruments 是您要诊断问题的工具。尝试使用 Time Profiler 检查您的应用,执行您观察到的任务以增加 CPU 使用率,然后分析结果,检查 Invert Call TreeHide System Libraries。如果您要检查特定时间段,您还可以设置时间标记。从这里,您可以看到哪些调用占用了 CPU。

@Paulw11 的评论很有帮助——Time Profiler 模板比 System Trace 工具更适合此任务。

我使用了 Time Profiler 并得到了一堆指向 UINavigationBar 的痕迹,作为我的自定义 UIControl layoutSubviews 的可疑重复调用者。进一步解释我的视图层次结构:

  • 我的 "Home" 视图控制器在其 UINavigationItem 中有一个自定义标题视图
  • 自定义标题视图是一个自定义 UIControl,在点击时会启动模式

这是交易:如果我 alloc-initWithFrame 我的自定义 UIControl 框架为 CGRectZero,应用程序会冻结。如果我为框架提供垃圾初始值(由于 UINavigationBar 重塑了我的自定义 UIControl 而被忽略),例如 CGRectMake(0, 0, 10, 10) 不会发生崩溃

我猜 UINavigationBar 对如何布局初始框架为 (0, 0, 0, 0) 的自定义标题视图感到困惑。听起来像是 Apple bug。

注意:我 运行 iOS 8.2.