一道关于 GCD\RunLoop的面试题
下面这道题打印出来的顺序是什么?
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"A");
[self performSelector:@selector(print) withObject:nil afterDelay:0];
NSLog(@"B");
});
}
-(void)print{
NSLog(@"C");
}
答案是 A B,不是 A C B。
解析:dispatch_get_global_queue获取的是全局并发队列,所以 从NSLog(@“A”);开始的三行是在新开辟的子线程中运行。
而 [self performSelector:withObject:afterDelay:]这个函数内部是以 向 Runloop 的 timer 来实现的(需要该线程中存在 RunLoop 并且在运行),而在这个新的线程中恰恰又没有建立起 RunLoop 对象,因此,print 函数无法被执行。