应用冻结,但 CPU 使用率随时间增加
App freezes but CPU usage increases over time
我已经在这件事上停留了好几个小时了,我不知道还能搜索什么。
我能提供的不多,因为调试器没有显示任何错误,但它是可重现的——我在 table 视图中点击一个非常具体的项目,该操作应该关闭该模式,然后我的应用程序冻结了。 table 视图中的其他项目不会发生这种情况——模态完全消失,应用程序继续运行。
我检查了 this answer 怀疑这是一个死锁,但是:
- 每次我在调试器中按下暂停按钮时,主线程都会发生一些不同的事情。
- 从 Xcode 的调试导航器中看到的 CPU 用法随着时间的推移而增加。
- 我在我的自定义 UIControl 的
layoutSubviews
方法之一中放置了断点,它一直被调用。它不会调用 [super layoutSubviews]
,不会对任何人调用 setNeedsLayout
,并且只是设置其子视图的框架,因为我没有使用 Autolayout。
我该如何调试这个东西?我一直在查看 Xcode 仪器,但我无法理解所看到的数据。具体来说,系统跟踪模板似乎能够在冻结发生时立即停止,这与其他继续记录的模板不同。
添加:我在系统跟踪中看到的内容
Instruments 是您要诊断问题的工具。尝试使用 Time Profiler
检查您的应用,执行您观察到的任务以增加 CPU 使用率,然后分析结果,检查 Invert Call Tree
和 Hide 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.
我已经在这件事上停留了好几个小时了,我不知道还能搜索什么。
我能提供的不多,因为调试器没有显示任何错误,但它是可重现的——我在 table 视图中点击一个非常具体的项目,该操作应该关闭该模式,然后我的应用程序冻结了。 table 视图中的其他项目不会发生这种情况——模态完全消失,应用程序继续运行。
我检查了 this answer 怀疑这是一个死锁,但是:
- 每次我在调试器中按下暂停按钮时,主线程都会发生一些不同的事情。
- 从 Xcode 的调试导航器中看到的 CPU 用法随着时间的推移而增加。
- 我在我的自定义 UIControl 的
layoutSubviews
方法之一中放置了断点,它一直被调用。它不会调用[super layoutSubviews]
,不会对任何人调用setNeedsLayout
,并且只是设置其子视图的框架,因为我没有使用 Autolayout。
我该如何调试这个东西?我一直在查看 Xcode 仪器,但我无法理解所看到的数据。具体来说,系统跟踪模板似乎能够在冻结发生时立即停止,这与其他继续记录的模板不同。
添加:我在系统跟踪中看到的内容
Instruments 是您要诊断问题的工具。尝试使用 Time Profiler
检查您的应用,执行您观察到的任务以增加 CPU 使用率,然后分析结果,检查 Invert Call Tree
和 Hide 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.