dispatch_group_t crash问题

本文讲述了在使用dispatch_group_t进行并发异步操作时,确保dispatch_group_enter和dispatch_group_leave成对使用的重要性,以及在遇到crash时需检查回调次数并合理管理,避免回调多次以防止不匹配导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用 dispatch_group_t 进行多个异步操作,任务完成时进行dispatch_group_notify,导致crash使用方法:

dispatch_group_enter()与dispatch_group_leave() 需要成对出现

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queque = dispatch_queue_create("com.doasync.operation.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_enter(group);
dispatch_group_async(group, queque, ^{
     //do something
     [self  doSomething:^(id __Nullable info) {
         dispatch_group_leave(group); 
     }];
}
dispatch_group_notify(group,queque, ^{
     //finish notify
     //do something
});

如果已经按照成对出现,依然出现 dispatch_group_leave()处crash,那么需要注意、检查异步时(自己做任务)的回调次数,也就是上面代码块中的

dispatch_group_async(group, queque, ^{
     //do something
     [self  doSomething:^(id __Nullable info) {

       //此处的回调次数 必须是一次 ,
   // 因为如果多次则会有 dispatch_group_leave 多次,导致不匹配则出现crash

         dispatch_group_leave(group); 
     }];
}

那么如何避免回调多次呢? 这就需要仔细查看 doSomething 逻辑:

1、 查看回调的地方是否存在多个地方? 如果存在多个地方则在回调完成后需要将其释放

2、如果是全局的 doSomething 回调为全局,在回调处可以将其置为nil

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值