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