ios 一道面试题

iOS 一道面试题

写出以下代码的打印结果

1
2
3
4
5
6
7
8
9
10
11
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
NSLog(@"1");
[self performSelector:@selector(test) withObject:nil afterDelay:.0];
NSLog(@"3");
});

- (void)test
{
NSLog(@"2");
}

打印结果:1 3

[self performSelector:@selector(test) withObject:nil afterDelay:.0];
这句代码的本质是往Runloop中添加定时器,但是子线程的Runloop默认是未启动的。

修改代码

1
2
3
4
5
6
7
8
9
10
11
12
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
NSLog(@"1");
[self performSelector:@selector(test) withObject:nil afterDelay:.0];
NSLog(@"3");
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
});

- (void)test
{
NSLog(@"2");
}

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];启动Runloop

打印结果 1 3 2