我有两个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
这是真的吗?我需要在这里发布吗?
答案 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()
时无效。始终在同一范围内配对创建/发布调用,假设您可以,这是一种更好的风格选择。