注意:此问题与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可以在运行时发出警告吗?或者至少给我们一些工具来帮助调试这些问题。
我看过的另一种方法(但没有尝试)是使用一些代码覆盖技术,并尝试在视觉中提取代码中的哪个线程,但没有走那条路。
你对如何解决这个问题有任何想法吗?
答案 0 :(得分:38)
Xcode 9引入了Main thread checker,它可以嗅探可能在主线外执行的许多相关问题。您可以在Scheme选项中使用此分析器以及其他运行时分析器。
替代方案,Xcode-way解决方案基于 steipete 的要点 - 符号断点:
您可以轻松地在任何UIKit
类上为其他方法添加断点,例如-[UIView setNeedsDisplay]
等。
答案 1 :(得分:4)
从Xcode 9开始Apple在Xcode中集成了Main Thread Checker,如果您使用Xcode调试器运行应用程序,默认情况下会启用它。
可以在诊断选项卡下的方案配置中禁用/启用它。
答案 2 :(得分:0)