1. ホーム
  2. objective-c

[解決済み] ARCはディスパッチキューをサポートしていますか?

2023-01-14 13:28:37

質問

ディスパッチキューにおけるメモリ管理について、apple のドキュメントを読んでいます。

ガベージコレクションのアプリケーションを実装しても、ディスパッチキューやその他のディスパッチオブジェクトの保持と解放を行う必要があります。Grand Central Dispatch は、メモリを再要求するためのガベージコレクションモデルをサポートしていません。

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

どのように解決するのですか?

簡単に説明します。はい、ARCはディスパッチキューを保持し、解放します。













そして、長い答えになりますが...。

デプロイメント ターゲットが iOS 6.0 または Mac OS X 10.8 よりも低い場合

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

デプロイメント ターゲットが iOS 6.0 または Mac OS X 10.8 以降の場合

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_retaindispatch_release , または を送信することで、キュー retainrelease メッセージ(例えば [queue retain][queue release] ).

古いコードベースとの互換性のために、キューを Objective-C オブジェクトとしてコンパイラに認識させないようにするために OS_OBJECT_USE_OBJC0 . 例えば、これを .pch ファイルに書くことができます (どの #import ステートメントの前)。

#define OS_OBJECT_USE_OBJC 0

を追加することもできます。 OS_OBJECT_USE_OBJC=0 をプリプロセッサー・マクロとしてビルド設定に追加します。 を設定すると OS_OBJECT_USE_OBJC0 ARCは ではない キューを保持したり解放したりすることはできませんので、自分で dispatch_retaindispatch_release .