应用程序冻结但 CPU 使用率随着时间的推移而增加
Posted
技术标签:
【中文标题】应用程序冻结但 CPU 使用率随着时间的推移而增加【英文标题】:App freezes but CPU usage increases over time 【发布时间】:2015-04-14 05:10:39 【问题描述】:我已经被这个东西困了好几个小时了,我不知道还要搜索什么。
我能提供的东西不多,因为调试器没有显示任何错误,但它是可重现的——我点击表格视图中的一个非常具体的项目,其行为应该关闭该模式,然后我的应用程序冻结。表格视图中的其他项目不会发生这种情况 - 模式完全关闭并且应用程序继续运行。
我检查了this answer,怀疑这是一个死锁,但是:
每次我点击调试器中的暂停按钮时,主线程都会执行不同的操作。 从 Xcode 的 Debug navigator 中看到的 CPU 使用率随着时间的推移而增加。 我在我的自定义 UIControl 的layoutSubviews
方法之一设置了断点,并且它不断被调用。它不调用[super layoutSubviews]
,不调用任何人的setNeedsLayout
,只是设置其子视图的框架,因为我没有使用自动布局。
我该如何调试这个东西?我一直在查看 Xcode Instruments,但无法理解所看到的数据。具体来说,系统跟踪模板似乎能够在发生冻结时立即停止,这与其他继续记录的模板不同。
补充:我在系统跟踪看到的内容
【问题讨论】:
您是否在点击该单元格后检查了递归方法调用。添加一些代码 你能确认你不是从后台线程操作 UI 吗?在所有情况下都不会在主线程上调用 didSelectRowAtIndexPath (***.com/a/22173707/80678) @kenleycapps 不,didSelectRowAtIndexPath 没有在后台线程中运行。它在主线程上运行,那里没有 dispatch_asyncs。 时间分析工具可能会更有用。选择“反转调用树”和“隐藏系统库”,看看它显示了什么 【参考方案1】:仪器是您要诊断问题的工具。尝试使用 Time Profiler
检查您的应用程序,执行您观察到的任务以增加 CPU 使用率,然后分析结果,检查 Invert Call Tree
和 Hide System Libraries
。如果您要检查特定时间段,您还可以设置时间标记。从这里,您可以看到哪些调用正在占用 CPU。
【讨论】:
【参考方案2】:@Paulw11 的评论有帮助 - Time Profiler 模板比 System Trace 工具更适合此任务。
我使用了时间探查器并得到了一堆指向 UINavigationBar 的跟踪,作为我自定义 UIControl 的layoutSubviews
的可疑重复调用者。进一步解释我的视图层次结构:
这里是交易:如果我 alloc-initWithFrame
我的自定义 UIControl
带有 CGRectZero
的框架,应用程序会冻结。如果我像CGRectMake(0, 0, 10, 10)
那样向框架提供垃圾初始值(因为 UINavigationBar 重塑了我的自定义 UIControl,所以无论如何都会忽略它),不会发生崩溃。
我猜 UINavigationBar 对如何布局具有(0, 0, 0, 0)
初始框架的自定义标题视图感到困惑。听起来像是 Apple 的错误。
注意:我在 ios 8.2 上运行。
【讨论】:
以上是关于应用程序冻结但 CPU 使用率随着时间的推移而增加的主要内容,如果未能解决你的问题,请参考以下文章
Apache Flink - 检查点数据大小随着时间的推移而增加
如何使用 DB2 sql 代码动态地将列转置为表的行,其中列可能会随着时间的推移而增加且无需更改代码?