一道關於 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 函數無法被執行。

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