陈斌彬的技术博客

Stay foolish,stay hungry

Dispatch_apply 和 Dispatch_async

dispatch_apply 作用是把指定次数指定的 block 添加到 queue 中

dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
dispatch_apply(10, queue, ^(size_t index) {
    NSLog(@"%zu",index);
});
NSLog(@"done");

dispatch_applydispatch_apply_f 是同步函数,会阻塞当前线程直到所有循环迭代执行完成。当提交到并发 queue 时,循环迭代的执行顺序是不确定的。

dispatch_async 任务未完成时释放对象标签:

GCD 中一个现象:在一个类中使用 dispatch_async 执行异步任务,任务未完成之前释放对象,并不能调用对象的 dealloc,而是在任务完成后才去调用 dealloc. 很常见的一个例子就是异步下载图片,图片未下载完成之前页面返回,并不会立马调用 dealloc,而是在下载完成后才去调用 dealloc. 经测试发现,当开始任务的时候 GCD 对对象添加了引用,导致对象的引用计数+1,所以释放对象时并不能真正释放,必须等任务完成后才能真正释放对象。

dispatch_queue_t含义

dispatch_queue_t 是用来执行 blocks 的对象。