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呼叫.在您编写此代码之后,最好在块外执行此操作.
仅释放您创建的队列; 不要释放主队列或全局并发队列(或者,再次,你没有自己创建的任何队列).将释放嵌套在队列中排队的工作块中也不是一个好主意,正如您所做的那样,因为它在错误的范围内执行此操作:
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().始终在同一范围内配对您的创建/发布调用,假设您可以,这是一个更好的风格选择.
| 归档时间: |
|
| 查看次数: |
13643 次 |
| 最近记录: |