ios - 检测主线程之外的 UI 操作

标签 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 中的公共(public)方法的地方中断,但找不到办法。

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

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

你知道如何解决这个问题吗?

最佳答案

Xcode 9 及更高版本

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

Xcode 8.3 及更早版本

基于 steipete 的要点 – 符号断点的替代 Xcode 方式解决方案:

Xcode Symbolic Breakpoint

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

关于ios - 检测主线程之外的 UI 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16053475/

相关文章:

ios - pattern.firstMatch 得到错误 : Expression type '@lvalue String?' is ambiguous without more context

iOS 6 : [self. tableview 重新加载数据] 禁用滚动?

iphone - SenTestingKit(与 XCode 集成)与 XCode 4 上的 GHUnit 进行单元测试?

ios - rightBarButtonItem 未显示在物理设备上

ios - iOS 中类似 Duolingo 的界面

ios - 相机 Controller IOS 的自定义形状

ios - HTTP 请求中的奇怪字符

iphone - LLVM 2.0 无法为 iPhone 模拟器构建。 GCC 4.2 工作正常

iphone - 如何在 XCode 4 中扩展堆栈跟踪

ios - 如何让 UIView 检测到父尺度的变化?