IBActions 是否在主队列上触发?

Are IBActions fired on main queue?

我试图搜索这个,但有点卡在这个问题上了。所有关于 UI 的指南都说,所有 UI 的东西都应该在 GCD 主线程上,但是没有人说 IBActions 的内部实现。

那么,是否在 GCD 主线程上触发了 IBActions?

是的,您可以使用NSLog(@"is main thread? %d", [NSThread isMainThread]);自行测试您还可以使用调试器和左视图来了解您的代码在哪个线程中执行。

可以安全地假设 @IBActions 仅由 Apple 的代码在主线程上调用。 Apple's documentation:

Important: Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.

注意:您的代码完全有可能在后台线程上调用 @IBAction 的方法。这就是我做出这种区分的原因。

注意:如果您在这里是因为 IBOutlet 上的错误,请使您的 IBOutlet 强(而不是弱)以避免在某些情况下访问取消引用的 IBOutlet。