Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否需要使用dispatch\u release()释放调度队列?_Objective C_Ios_Objective C Blocks_Grand Central Dispatch - Fatal编程技术网

Objective c 是否需要使用dispatch\u release()释放调度队列?

Objective c 是否需要使用dispatch\u release()释放调度队列?,objective-c,ios,objective-c-blocks,grand-central-dispatch,Objective C,Ios,Objective C Blocks,Grand Central Dispatch,我有两个异步的GCD块。第一个用于后台线程,第二个在主线程上运行。这非常有效,但我刚刚看到有人在谈论我可能需要使用dispatch\u 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

我有两个异步的
GCD
块。第一个用于后台线程,第二个在主线程上运行。这非常有效,但我刚刚看到有人在谈论我可能需要使用
dispatch\u 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

这是真的吗?我需要在这里释放它们吗?

您只需要释放使用
调度\u queue\u create
创建的队列。主队列将始终存在,释放它是没有意义的


添加到队列中的任何块都将保留队列本身,因此您可以在调用
dispatch\u async
后安全地调用
dispatch\u release(queue)
。最好在这里编写代码之后在块外执行此操作。

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

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

当您稍后更改代码以添加第二个
dispatch\u async()
时,将不起作用。如果可以的话,总是在同一范围内配对创建/释放调用是一个更好的风格选择。

好的,但是如果我在队列外执行,它不会自动释放吗?@NicHubbard它会在队列的所有工作完成后释放,例如,你可以创建一个队列,向它分配3-4个块,并在调度呼叫后释放它。队列将一直保留,直到所有块完成其相应的任务。现在您不再需要这个队列了。好吧,我只需要在dispatch\u asynch调用之外释放它?是的。具体地说,您需要在与create调用相同的范围内执行此操作,以免为自己设置地雷,以便稍后使用,正如我在回答中所说明的(此规则的唯一例外可能是终结器,但不要混淆:))根据需要调用dispatch_release()的头文件中的注释在您创建的任何队列上。