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

Nic*_*ard 7 objective-c grand-central-dispatch ios objective-c-blocks

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

// 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
Run Code Online (Sandbox Code Playgroud)

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

rse*_*sez 13

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

添加到队列中的任何块都将保留队列本身,因此您可以在通话dispatch_release(queue)后安全地dispatch_async呼叫.在您编写此代码之后,最好在块外执行此操作.

  • @NicHubbard当所有队列的工作完成后它将被释放,例如你可以创建一个队列,向它发送3-4个块,并在调度调用后释放它.队列将保持保留状态,直到所有块完成相应的任务.此时您不再需要此队列. (2认同)

jkh*_*jkh 9

仅释放您创建的队列; 不要释放主队列或全局并发队列(或者,再次,你没有自己创建的任何队列).将释放嵌套在队列中排队的工作块中也不是一个好主意,正如您所做的那样,因为它在错误的范围内执行此操作:

queue = dispatch_queue_create(...)
dispatch_async(queue, ^{ something; dispatch_release(queue); });
dispatch_async(queue, ^{ something else}); // CRASH!
Run Code Online (Sandbox Code Playgroud)

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