主线程检查器:UI API 在后台线程上调用:-[UIApplication delegate]

Main Thread Checker: UI API called on a background thread: -[UIApplication delegate]

Xcode 9 似乎报告了很多对 UIA​​pplication 属性的主线程调用。尽管 UI 没有更新,但由于日志的扩展,它会产生默认环境,这特别麻烦。

4   TestApp                             0x0000000101c262e0 __39-[ViewController viewDidLoad]_block_invoke + 196
5   libdispatch.dylib                   0x0000000102279654 _dispatch_call_block_and_release + 24
6   libdispatch.dylib                   0x0000000102279614 _dispatch_client_callout + 16
7   libdispatch.dylib                   0x0000000102289008 _dispatch_queue_serial_drain + 716
8   libdispatch.dylib                   0x000000010227ce58 _dispatch_queue_invoke + 340
9   libdispatch.dylib                   0x000000010228a1c4 _dispatch_root_queue_drain_deferred_wlh + 412
10  libdispatch.dylib                   0x00000001022917fc _dispatch_workloop_worker_thread + 868
11  libsystem_pthread.dylib             0x00000001ac6771e8 _pthread_wqthread + 924
12  libsystem_pthread.dylib             0x00000001ac676e40 start_wqthread + 4

如果这些报告消息让您感到困惑取消选中它们:

  1. 编辑方案...
  2. 取消选中 运行 > 诊断
  3. 中的 "Main Thread Checker"

同时检查 ARKit template Xcode project Main Thread Checker log console

如果从另一个线程调用 UIApplication 或 UIApplicationDelegate 方法,您可以像 CGN 答案中一样禁用检查线程,但它会完全禁用此检查器。您还可以对必要的子类进行子类化,并在主线程上调用超类的方法。这样你仍然可以在代码的其他地方使用Main Thread Sanitizer