5

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

我的问题是,在某一时刻,对象可能会被释放,并且在释放时,为了整洁,我想完全删除调度队列和其中的所有dispatch_block_t对象,无论队列是否被挂起。

据我了解,队列在不再“需要”之前不会解除分配,因为它不再被其中的调度块保留。这使我相信,要释放队列,我必须通过允许其中的块首先执行终止来清空它。

解决此问题的最简单和最可靠的方法是什么?

4

1 回答 1

9

一般来说,这不是你应该太担心的事情。来自并发编程指南中调度队列的内存管理

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

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

这使我相信,要释放队列,我必须通过允许其中的块首先执行终止来清空它。

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

如果您从代码中暂停和恢复队列,这不会导致问题 - 因为您必须平衡所有暂停和恢复调用。如果你让你的队列处于暂停状态,你会过得很糟糕。也就是说,您还可以选择为队列设置清理功能,使用dispatch_set_finalizer_f. 这不应该是必要的,但如果你需要它就在那里。

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

于 2012-06-23T00:43:42.723 回答