7

私は2つのGCDブロックが非同期です。最初はバックグラウンドスレッド用、2番目はメインスレッド上で実行されます。これは素晴らしいですが、私はちょうどdispatch_release()を使ってそれらをリリースする必要があるかもしれないと話していました。例:dispatch_queue_tは、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 

これは本当ですか?私はここでそれらをリリースする必要がありますか?

+0

ヘッダーファイルのコメントごとに、作成するすべてのキューでdispatch_release()を呼び出す必要があります。 – BonanzaDriver

答えて

8

作成するリリースキューのみ。メイン・キューまたはグローバル・コンカレント・キューを解放しないでください(または、自分で作成していないキューも)。ときに、後で

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

は動作しません:それは間違っているスコープでそれをやっているし、これはので、それは、また、あなたがやっているような作業ブロック内のリリースは、そのキューに登録巣には良い考えではありませんそれを追加するコードを変更してください。dispatch_async()。あなたができると仮定すると、常に同じスコープであなたの作成/リリースのコールをペアリングすることは、より良い文体の選択です。

+0

それでは、dispatch_asynchコールの外でリリースする必要がありますか? –

+0

はい。具体的には、create callと同じスコープで実行する必要があります。これは、自分の答えに描かれているように、自分で地雷を設定する必要があります(このルールの唯一の例外はファイナライザですが、混乱物:)) – jkh

13

dispatch_queue_createで作成されたキューを解放するだけで済みます。メインのキューは常に存在し、解放するのは意味がありません。

キューに追加されたブロックは、キュー自体を保持しますので、あなたは安全にあなたのdispatch_async呼び出しの後dispatch_release(queue)を呼び出すことができます。あなたがここに書いたコードの後で、これをブロック外で行うのがベストです。

+0

私はそれをキューの外で行うと、自動的に解放されませんか? –

+2

@ NicHubbardキューの作業がすべて完了したときに解放されます。たとえば、キュ​​ーを作成し、それに3〜4ブロックをディスパッチし、ディスパッチコール後にリリースすることができます。すべてのブロックが対応するタスクを完了するまで、キューは保持されたままになります。この時点では、このキューは必要ありません。 – Pochi