关于GCD-记一个特别sb的问题,居然掉坑里了
2016-11-04 本文已影响66人
jy__Lu
在sunny的博客里看到这样一个面试题
//以下代码运行结果如何?
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
开始一看,哇擦,很简单啊,正常打印就好了啊,然后手贱的试了一下,根本不是那么回事啊,会死锁啊,这也看出来个人基础稍微有点差啊
我们这样来看,程序执行到gcd这一步的时候,会将block添加到主队列尾等待执行,但是又同时用了sync同步函数,同步函数就是我的block没有执行你就别往下走了,等着,我搞完了你才能接着执行,但是呢,它所添加的这个block又在队列最后,必须要等到前面的任务执行完之后才能执行到,所以争执不下干脆程序就罢工了
从这里我们也可以看出在主线程中一定不要使用同步主队列方式添加任务,要不然是会crush掉的