dispatch_semaphore崩溃

当某个dispatch_semaphore_t正处于dispatch_semaphore_wait的时候,释放这个dispatch_semaphore_t的引用(sema = nil),将会导致崩溃。
示例:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.sema = dispatch_semaphore_create(0);
    
    // 每隔1秒释放一个信号量
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
        dispatch_semaphore_signal(self.sema);
    }];
    
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 模拟10个任务
        for (NSInteger index = 1; index <= 10; ++ index) {
            // 每个任务都需要等待到有信号量才能开始
            dispatch_semaphore_wait(self.sema, DISPATCH_TIME_FOREVER);
            NSLog(@"执行任务%@...", @(index));
        }
        
        // 全部任务执行完毕
        [timer invalidate];
    });
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesEnded");
    
    // crash!
    // 当某个dispatch_semaphore_t正处于dispatch_semaphore_wait的时候
    // 释放这个dispatch_semaphore_t的引用,将会导致崩溃
    self.sema = nil;
}

控制台:

2016-11-22 16:01:50.520 SemaDemo[2990:136781] 执行任务1...
2016-11-22 16:01:51.482 SemaDemo[2990:136781] 执行任务2...
2016-11-22 16:01:52.495 SemaDemo[2990:136781] 执行任务3...
2016-11-22 16:01:53.209 SemaDemo[2990:136725] touchesEnded
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文为转载资料,原文地址: //www.greatytc.com/p/02821f9d7777 一、信号量...
    一曰就是一天阅读 4,929评论 0 3
  • GCD是异步执行任务的技术支之一,开发者只需要将想要执行的block任务添加到适当的Dispatch Queue(...
    zziazm阅读 5,727评论 0 8
  • 1. 并行和并发 简单来说,若说两个任务A和B并发执行,则表示任务A和任务B在同一时间段里被执行(更多的可能是二者...
    Z_Han阅读 3,808评论 0 8
  • 这大概就是,曾经沧海难为水-的感觉吧。
    沃雷塔尔阅读 1,313评论 0 0
  • 看了燕子的育儿方法。我也川川一小时完成作业。川川上了一年学前班,现在学校留的这点作业不是问题,一小时肯定能做完。 ...
    川川故事集阅读 1,215评论 0 0