「ディスパッチキューのメモリ管理」に関するAppleのドキュメントを読んでいます。
ガベージコレクションされたアプリケーションを実装する場合でも、ディスパッチキューおよびその他のディスパッチオブジェクトを保持および解放する必要があります。 Grand Central Dispatchは、メモリを回収するためのガベージコレクションモデルをサポートしていません。
私はARCがガベージコレクタではないことを知っていますが、dispatch_retainとdispatch_releaseをdispatch_queue_tにする必要がないことを確認したいと思います
そして今、長い答えを…
キューでdispatch_retain
とdispatch_release
を使用する必要があります。 ARCはそれらを管理しません。
ARCがキューを管理します。 ARCが有効な場合、dispatch_retain
またはdispatch_release
を使用する必要はありません(使用できません)。
IOS 6.0 SDKおよびMac OS X 10.8 SDK以降では、すべてのディスパッチオブジェクト(dispatch_queue_t
を含む)もObjective-Cオブジェクトです。これは、<os/object.h>
ヘッダーファイルに記載されています。
* By default, libSystem objects such as GCD and XPC objects are declared as
* Objective-C types when building with an Objective-C compiler. This allows
* them to participate in ARC, in RR management by the Blocks runtime and in
* leaks checking by the static analyzer, and enables them to be added to Cocoa
* collections.
*
* NOTE: this requires explicit cancellation of dispatch sources and xpc
* connections whose handler blocks capture the source/connection object,
* resp. ensuring that such captures do not form retain cycles (e.g. by
* declaring the source as __weak).
*
* To opt-out of this default behavior, add -DOS_OBJECT_USE_OBJC=0 to your
* compiler flags.
*
* This mode requires a platform with the modern Objective-C runtime, the
* Objective-C GC compiler option to be disabled, and at least a Mac OS X 10.8
* or iOS 6.0 deployment target.
これは、キューをNSArray
またはNSDictionary
に、またはstrong
、weak
、unsafe_unretained
のいずれかを持つプロパティに格納できることを意味します、assign
、またはretain
属性。また、ブロックからキューを参照する場合、ブロックはキューを自動的に保持することも意味します。
展開ターゲットが少なくともiOS 6.0の場合またはMac OS X 10.8、およびARCが有効になっているの場合、ARCはキューを保持および解放し、コンパイラーはフラグを立てますdispatch_retain
またはdispatch_release
をエラーとして使用してみてください。
展開ターゲットがiOS 6.0以上の場合またはMac OS X 10.8、およびARCが無効になっているの場合、キューを手動で保持および解放する必要がありますeitherdispatch_retain
およびdispatch_release
を呼び出して、orキューを送信してretain
およびrelease
メッセージ([queue retain]
および[queue release]
など)。
古いコードベースとの互換性のために、OS_OBJECT_USE_OBJC
から0
を定義することにより、コンパイラがキューをObjective-Cオブジェクトとして認識しないようにすることができます。たとえば、これを.pch
ファイルに(#import
ステートメントの前に)配置できます。
#define OS_OBJECT_USE_OBJC 0
または、ビルド設定でプリプロセッサマクロとしてOS_OBJECT_USE_OBJC=0
を追加できます。 OS_OBJECT_USE_OBJC
を0
に設定すると、ARCはnotキューを保持または解放します。dispatch_retain
およびdispatch_release
。
ここでフォローアップ...最小展開ターゲットがiOS 6の場合、ARCがそれらを管理するようになりました。