5

初期化時に を使用してシリアルGCD キューを作成しdispatch_queue_create、割り当て解除呼び出し時にオブジェクトがありますdispatch_free。オブジェクトの有効期間中、ディスパッチ ブロックがキューに追加されますが、キューも および を使用して停止および開始さdispatch_suspenddispatch_resumeます。

dispatch_block_t私の問題は、ある時点でオブジェクトが解放される可能性があり、割り当てが解除されたときに、整理のために、キューが中断されているかどうかに関係なく、ディスパッチキューとその中のすべてのオブジェクトを完全に削除したいということです。

私が理解しているように、キューは、その中のディスパッチブロックによって保持されなくなったという意味で「必要」でなくなるまで割り当てを解除しません。これにより、キューの割り当てを解除するには、最初にキュー内のブロックを実行して終了できるようにして、キューを空にする必要があると思います。

これを行うための最も簡単で堅牢な方法は何ですか?

4

1 に答える 1

9

一般的に、これはあまり心配する必要はありません。並行性プログラミングガイドのディスパッチキューのメモリ管理から:

dispatch_retain関数とdispatch_release関数を使用して、必要に応じてその参照カウントをインクリメントおよびデクリメントできます。キューの参照カウントがゼロに達すると、システムは非同期的にキューの割り当てを解除します。

したがって、を呼び出すとdispatch_release(myQueue)、保持カウントが減りますが、キューに残っているタスクはすべてキューを保持します。これらが完了するまで、キューの保持カウントは0になりません。したがって、質問のこの部分は次のとおりです。

これにより、キューの割り当てを解除するには、キュー内のブロックを最初に終了するまで実行できるようにして、キューを空にする必要があると思います。

正確です。実行したくないタスクがキューにある場合は、読み続けてください。

コードからキューを一時停止して再開する場合、これは問題を引き起こしません-すべての一時停止と再開の呼び出しのバランスをとる必要があるためです。キューを一時停止状態のままにしておくと、ひどい時間を過ごすことになります。とはいえ、を使用してキューのクリーンアップ機能を設定するオプションもありますdispatch_set_finalizer_f。これは必要ないはずですが、必要に応じてあります。

ここで説明していることに基づいて、代わりにNSOperationとNSOperationQueueを使用することをお勧めします。これはGCDの上位層であり、タスクをキャンセルしたり、GCDを直接使用して行うのがはるかに難しいその他の便利なことを実行したりできます。

于 2012-06-23T00:43:42.723 に答える