一道关于 GCD\RunLoop的面试题

一道关于 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 函数无法被执行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章