[解決済み] ARCはディスパッチキューをサポートしていますか?
質問
ディスパッチキューにおけるメモリ管理について、apple のドキュメントを読んでいます。
ガベージコレクションのアプリケーションを実装しても、ディスパッチキューやその他のディスパッチオブジェクトの保持と解放を行う必要があります。Grand Central Dispatch は、メモリを再要求するためのガベージコレクションモデルをサポートしていません。
ARC がガベージコレクタではないことは知っていますが、私の dispatch_queue_t を dispatch_retain と dispatch_release する必要がないことを確認したいと思います。
どのように解決するのですか?
簡単に説明します。はい、ARCはディスパッチキューを保持し、解放します。
そして、長い答えになりますが...。
デプロイメント ターゲットが iOS 6.0 または Mac OS X 10.8 よりも低い場合
を使用する必要があります。
dispatch_retain
と
dispatch_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_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
.
関連
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] IBOutletsはARCのもとで強くなるべきか、弱くなるべきか?
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み】ARCで@autoreleasepoolがまだ必要なのはなぜですか?
-
[解決済み] Objective-Cで配列に結合する
-
[解決済み] BOOLプロパティの使用
-
[解決済み] NSSetからNSMutableArrayを返す方法
-
[解決済み] std::stringをNSStringに変換する方法は?
-
[解決済み] Objective-Cでの文字列比較
-
[解決済み] NSIntegerをint型に変換するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】2つの非同期ブロックが実行されるまで、別のブロックを開始するのを待つ
-
[解決済み] Objective-Cのクラス→文字列のようなものです。[NSArray className] -> @"NSArray" のようになります。
-
[解決済み] Xcodeはクラッシュの原因となる行を表示しない
-
[解決済み] Swiftでクラスをプロトコルに準拠させるには?
-
[解決済み] 「アプリケーションはアクティブなコントローラを表示しようとした」?
-
[解決済み] UIButtonsの背景色を変更することはできますか?
-
[解決済み] iOS - プログラムでUISwitchを設定する方法
-
[解決済み] Objective-Cでクラスのインスタンスを@protocolにキャストする
-
[解決済み] IOS: 角の丸いUIImageまたはUIImageViewを作成する
-
[解決済み] NSIntegerをint型に変換するには?