dispatch_queue_t需要使用dispatch_release()发布吗?

时间:2012-02-23 23:04:17

标签: objective-c ios objective-c-blocks grand-central-dispatch

我有两个GCD块异步。第一个是后台线程,第二个是主线程。这很好用,但我只是在某处谈论我可能需要使用dispatch_release()释放它们。 E.g:

// Use gcd
dispatch_queue_t queue = dispatch_queue_create("com.awesome", 0);
dispatch_queue_t main = dispatch_get_main_queue();

//  do the long running work in bg async queue
// within that, call to update UI on main thread.
dispatch_async(queue, ^{ 
   // Do work in the background



    // Release
    dispatch_release(queue);

   dispatch_async(main, ^{ 

       // Main


       // Release
       dispatch_release(main);

   });//end
});//end

这是真的吗?我需要在这里发布吗?

2 个答案:

答案 0 :(得分:13)

您只需要释放使用dispatch_queue_create创建的队列。主队列将始终存在,释放它是没有意义的。

添加到队列中的任何块都将保留队列本身,因此您可以在dispatch_release(queue)呼叫后安全地呼叫dispatch_async。最好在你写完这些代码之后在街区之外做这件事。

答案 1 :(得分:8)

仅发布您创建的队列;不要释放主队列或全局并发队列(或者,再次,你没有自己创建的任何队列)。将发布版本嵌入在该队列中排队的工作块中也不是一个好主意,因为这样做是在错误的范围内进行的:

queue = dispatch_queue_create(...)
dispatch_async(queue, ^{ something; dispatch_release(queue); });
dispatch_async(queue, ^{ something else}); // CRASH!

以后更改代码以添加第二个dispatch_async()时无效。始终在同一范围内配对创建/发布调用,假设您可以,这是一种更好的风格选择。