22

注意:这个问题与从后台线程调用 UIKit 时发出警告有关,但没有给出以下两种方法的答案。

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

因此,我在很多地方都放了以下代码:

assertMainThread();

这是:

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

当然,我不能用 assertMainThread() 覆盖整个代码,因为有很多地方,并且后台 GCD 队列以合法的方式使用了一些代码。

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

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

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

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

4

3 回答 3

43

Xcode 9 及更高版本

Xcode 9 引入了一个主线程检查器,它可以嗅探许多可能在主线程外执行的相关问题。您可以在您的方案选项中以通常的方式启用此分析器以及其他运行时分析器。

Xcode 8.3 及更早版本

另一种基于steipete要点的 Xcode 方式解决方案 - 符号断点:

Xcode 符号断点

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

于 2015-11-03T13:58:43.577 回答
4

从 Xcode 9 开始,Apple 在 Xcode 中集成了一个主线程检查器,如果您使用 Xcode 调试器运行您的应用程序,默认情况下会启用该主线程检查器。

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

于 2017-06-11T19:40:45.413 回答
1

Xcode 11/Swift 版本的@Michi 的回答 在此处输入图像描述

于 2019-11-07T16:19:09.147 回答