EXC_BAD_INSTRUCTION GCD死锁

经典demo:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");

   //换异步
   dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"打印2");
    });
}
EXC_BAD_INSTRUCTION GCD死锁_第1张图片
屏幕快照 2018-03-16 11.02.50.png

分析一下这个Demo的流程。首先打印1,然后调用sync方法。在主线程中,我需要执行sync方法。sync方法中有一个打印2的事情。也要在主线程去做。由于主线程同一时间只能做一件事。于是打印2需要等待sync方法完成再去执行。而sync同步方法的完成,需要等待block中的打印2完成。于是就形成了死锁。两个事件相互等待。

你可能感兴趣的:(EXC_BAD_INSTRUCTION GCD死锁)