如果在mainQueue / mainThread之外运行,NavigationController.pushViewController会崩溃

时间:2015-02-24 08:24:18

标签: ios objective-c

我有这样的代码

SomeController *controller = [[SomeController alloc] init];
[self.navController setViewControllers:@[controller] animated:YES];

如果在non-main thread中运行此代码,则应用程序在执行上述代码的resignFirstResponder viewController期间崩溃

如果在dispatch_async(dispatch_get_main_queue, ^{});

中运行此代码

然后它工作正常,没有崩溃

为什么它会在第一种情况中崩溃?我想如果在非主线程中运行,那么UI不会看到更改,但我没想到它会崩溃?

1 个答案:

答案 0 :(得分:1)

应该在主线程上调用UIKit类。 Apple的UIKit documentation州:

  

请注意

     

在大多数情况下,只能从应用程序的主线程中使用UIKit类。对于从UIResponder派生的类或涉及以任何方式操纵应用程序的用户界面的类尤其如此。

因为UIKit假定它将在主线程上运行,所以如果你试图在另一个线程上访问它,将无法保证会发生什么。您的UI可能不会更新,您可能会崩溃等等。如果某些类发现您在非主线程上调用它们,则可能会发生异常。