回答:
そして今、長い答えのために...
あなたは使用する必要がありますdispatch_retain
し、dispatch_release
自分のキューに。ARCはそれらを管理しません。
ARCがキューを管理します。あなたが使用(とすることはできません)する必要はありませんdispatch_retain
か、dispatch_release
ARCが有効になっている場合。
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が無効になってい、手動で保持し、あなたのキューを解放しなければならないのいずれかを呼び出すことによってdispatch_retain
、およびdispatch_release
、またはキュー送信することによって、retain
およびrelease
(のようなメッセージを[queue retain]
して[queue release]
)。
古いコードベースとの互換性のために、あなたが定義することで、Objective-Cのオブジェクトとして、あなたのキューを見てから、コンパイラを防ぐことができますOS_OBJECT_USE_OBJC
し0
。たとえば、これを.pch
ファイルに(#import
ステートメントの前に)置くことができます。
#define OS_OBJECT_USE_OBJC 0
またはOS_OBJECT_USE_OBJC=0
、ビルド設定でプリプロセッサマクロとして追加できます。あなたが設定した場合OS_OBJECT_USE_OBJC
に0
、ARCはなりません保持またはあなたのためにキューを解放し、あなたが使用してそれを自分で行う必要がありますdispatch_retain
とdispatch_release
。
dispatch_release
て NULL
いる場合は、5.1 dealloc
コード内のとオブジェクトが必要です。そうでない場合、何か(コンパイラーによって生成されたコード?ランタイム自体?)がオブジェクトを再度解放しようとします。
ここで補足します...最小の展開ターゲットがiOS 6の場合、ARCがそれらを管理します。