web-dev-qa-db-ja.com

ARCはディスパッチキューをサポートしていますか?

「ディスパッチキューのメモリ管理」に関するAppleのドキュメントを読んでいます。

ガベージコレクションされたアプリケーションを実装する場合でも、ディスパッチキューおよびその他のディスパッチオブジェクトを保持および解放する必要があります。 Grand Central Dispatchは、メモリを回収するためのガベージコレクションモデルをサポートしていません。

私はARCがガベージコレクタではないことを知っていますが、dispatch_retainとdispatch_releaseをdispatch_queue_tにする必要がないことを確認したいと思います

93
flagg19

短い答え:はい、ARCはディスパッチキューを保持および解放します。







そして今、長い答えを…

展開ターゲットがiOS 6.0またはMac OS X 10.8よりも低い場合

キューでdispatch_retaindispatch_releaseを使用する必要があります。 ARCはそれらを管理しません。

展開ターゲットがiOS 6.0またはMac OS X 10.8以降の場合

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に、またはstrongweakunsafe_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_OBJC0に設定すると、ARCはnotキューを保持または解放します。dispatch_retainおよびdispatch_release

232
rob mayoff

ここでフォローアップ...最小展開ターゲットがiOS 6の場合、ARCがそれらを管理するようになりました。

23
kcharwood