一雹洗、請問下面代碼的打印結果是什么弹沽?
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
NSLog(@"1");
[self performSelector:@selector(test) withObject:nil afterDelay:0.0];
NSLog(@"3");
});
}
- (void)test{
NSLog(@"2");
}
答:打印結果是1鸳吸、3
原因是:
1张肾、performSelector:withObject:afterDelay:的本質是往Runloop中添加定時器
2、子線程默認沒有啟動Runloop
注意:只要有 afterDelay 延時操作的都是runloop的API
二截珍、請問下面代碼的打印結果是什么攀甚?
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSThread *thread = [[NSThread alloc]initWithBlock:^{
NSLog(@"1");
}];
[thread start];
[self performSelector:@selector(test) onThread:thread withObject:nil waitUntilDone:YES];
}
- (void)test{
NSLog(@"2");
}
答案:打印結果是 1 然后崩潰
原因:
thread 是子線程 子線程的runloop沒有被開啟 打印完1 子線程就結束退出了
此時再去往這個線程里添加任務 就會出現(xiàn)異常 然后崩潰
以上兩個面試題 都是考runloop的知識 了解runloop的底層原理上面的兩道題就會迎刃而解