如何在发布时清空并完全释放Grand Central Dispatch队列?

Dan*_*Dan 4 macos cocoa grand-central-dispatch objective-c-blocks

我有一个对象,初始化时使用和释放调用创建一个串行 GCD队列.在对象的生命周期内,将调度块添加到队列中,但队列也会停止并使用和启动.dispatch_queue_createdispatch_freedispatch_suspenddispatch_resume

我的问题是,在某一点上,对象可能会被释放,并且在解除分配时,为了整洁,我希望完全丢弃调度队列及其中的所有dispatch_block_t对象,无论队列是否暂停.

据我了解,队列将不再解除分配,直到不再需要它,因为它不再由其中的调度块保留.这让我相信要解除分配队列,我必须通过允许其中的块首先执行终止来清空它.

什么是最简单,最强大的方法?

que*_*ish 8

一般来说,这不是你应该过分担心的事情.从"并发编程指南"中的"调度队列的内存管理":

您可以使用dispatch_retain和dispatch_release函数根据需要递增和递减该引用计数.当队列的引用计数达到零时,系统异步释放队列.

因此,当您调用时dispatch_release(myQueue),您正在降低保留计数,但仍在队列中的任何任务都将保留队列.直到这些完成后,队列的保留计数才为0.所以这部分问题:

这让我相信要解除分配队列,我必须通过允许其中的块首先执行终止来清空它.

很准确.如果您有可能不想在队列中运行的任务,请继续阅读.

如果您从代码中暂停并恢复队列,这不会导致问题 - 因为您必须平衡所有挂起和恢复调用.如果你让你的队列处于暂停状态,你将会遇到糟糕的时间.也就是说,您还可以使用选项为队列设置清理功能dispatch_set_finalizer_f.这不应该是必要的,但是如果你需要它就会存在.

现在,根据您在此处描述的内容,我建议使用NSOperation和NSOperationQueue.它是GCD之上的一个更高级别的层,允许您取消任务并执行一些其他有用的事情,这些事情直接使用GCD更难做到.