一、请问下面代码的打印结果是什么?
- (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 子线程就结束退出了
此时再去往这个线程里添加任务 就会出现异常 然后崩溃
以上两个面试题 都是考runloop的知识 了解runloop的底层原理上面的两道题就会迎刃而解
网友评论