检测主线程之外的UI操作

时间:2013-04-17 06:54:41

标签: ios xcode4 uikit lldb

注意:此问题与Warn on calls to UIKit from background threads有关,但未对以下两种方法给出答案。

我有一个问题,即应用程序屏幕快速闪烁。我过去已经遇到过这个问题,这是因为更新了主线程之外的UI元素。

因此我将以下代码放在很多地方:

assertMainThread();

是:

#define assertMainThread() NSAssert([NSThread isMainThread],@"Method called using a thread other than main!")

当然我无法使用assertMainThread()覆盖整个代码,因为有许多地方,并且某些代码由后台GCD队列以合法的方式使用。

我查看了许多地方,但找不到XCode或LLDB告诉我何时在主线程之外更新UI元素的方法。我认为可以使用符号断点或其他一些机制来破解UIKit中常见方法在主线程外部调用的地方,但是找不到方法。

我还以为UIKit可以在运行时发出警告吗?或者至少给我们一些工具来帮助调试这些问题。

我看过的另一种方法(但没有尝试)是使用一些代码覆盖技术,并尝试在视觉中提取代码中的哪个线程,但没有走那条路。

你对如何解决这个问题有任何想法吗?

3 个答案:

答案 0 :(得分:38)

Xcode 9及更高版本

Xcode 9引入了Main thread checker,它可以嗅探可能在主线外执行的许多相关问题。您可以在Scheme选项中使用此分析器以及其他运行时分析器。

Xcode 8.3及更早版本

替代方案,Xcode-way解决方案基于 steipete 的要点 - 符号断点:

Xcode Symbolic Breakpoint

您可以轻松地在任何UIKit类上为其他方法添加断点,例如-[UIView setNeedsDisplay]等。

答案 1 :(得分:4)

从Xcode 9开始Apple在Xcode中集成了Main Thread Checker,如果您使用Xcode调试器运行应用程序,默认情况下会启用它。

可以在诊断选项卡下的方案配置中禁用/启用它。

答案 2 :(得分:0)

Xcode 11 / @ Michi的答案的迅捷版本 enter image description here