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

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

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

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

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

一般来说,这不是你应该过分担心的事情.从 Memory Management for Dispatch Queues in the Concurrency Programming Guide开始:

You can use the dispatch_retain and dispatch_release functions to increment and decrement that reference count as needed. When the reference count of a queue reaches zero, the system asynchronously deallocates the queue.

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

This leads me to believe that to deallocate the queue, I have to empty it by allowing blocks within it to execute to termination first.

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

如果您从代码中暂停并恢复队列,这不会导致问题 – 因为您必须平衡所有挂起和恢复调用.如果您将队列置于暂停状态,you’re going to have a bad time.
也就是说,您还可以使用dispatch_set_finalizer_f为队列设置清理功能.这不应该是必要的,但是如果你需要它就会存在.

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

相关文章
相关标签/搜索