一部のファイルの自動参照カウントを無効にする


183

iOS 5 SDKをダウンロードしましたが、ARCは新しいAppleコンパイラの優れた機能であることがわかりました。当面の間、多くのサードパーティフレームワークはARCをサポートしていません。新しいコードにARCを使用して、現在の保持/リリースコードを変更せずに維持できますか?JSONKitなどの一部のフレームワークは、コンバーターを使用してARCに変換できないため、ARCコンバーターはここでは機能しません。

編集:

答えは、-fno-objc-arcARCを必要としないファイルのコンパイラフラグに追加することです。Xcode 4では、ターゲット->ビルドフェーズ->ソースのコンパイルでこれを行うことができます。



2
明確にするために、.mファイルに追加するだけです。.hファイルではありません。
ma11hew28 2011

私はこの会話を見つけました:github.com/gowalla/AFNetworking/issues/36たぶん、それは誰かがJSONKitをiOS5 ARCがサポートするプロジェクトに統合する方法を助けるかもしれません;-)しかし、私は今それを試していません...

この方法でうまくいきました。UDPマルチキャスト用のAsyncUdpSocketをプロジェクトに追加しましたが、これらのファイル(少なくとも現在のバージョン)はARCをサポートしていません。したがって、上記の方法を使用してコンパイラフラグをAsyncUdpSocket.mファイルに追加し、アプリケーションでコードが正常に機能するようにすることができます。
Ashu Joshi

2
これは完璧に動作します!詳細:ターゲットに移動し、[ビルドフェーズ]、[ソースのコンパイル]の順に選択します。問題の.mファイルをダブルクリックすると、次のように入力/貼り付けできるボックスがポップアップ表示されます: "-fno-objc-arc"
mpemburn

回答:


73

公開ARCドキュメントは、この点については明確ではありませんが、各クラスがすべてARCまたはすべて手動で管理されている限り、クラスを単一のプログラムに統合できることを示唆しているようです。

1つのクラスでARCと非ARCを混在させることはできません。文書は、送信と言うretainreleaseautorelease、またはretainCount(使用タイマと遅延を行うなど、任意の手段によってメッセージ@selectorARCコードで禁止されています)。したがって、ARCクラスで非ARCを実行することはできません(必要なメッセージが禁止されているため)。ARCを非ARCクラスで実行することはできません(ARCは、ARCがないと無効な構文要素を追加するためです)。

同じドキュメントは、ARC以外のライブラリ/フレームワークをARCプログラムに統合できるかどうかについて少し明確です:はい。すべてのコードが非ARCであるプログラムでARCライブラリー/フレームワークを使用できるかどうかについては触れられていませんが、上記のすべてを考慮すると、その意味は「はい」のようです。


ありがとうございました!既存の非ARCクラスのARCを無効にする方法を理解しました。
nonamelive

何をしているか教えて頂けますか?
デビッドH

1
@David H:それを質問者に伝えるつもりなら、質問者が彼らの解決策を質問に編集したことに注意すべきです。
Peter Hosey、2011

HEADERファイルでARCコンパイルを無効にすることはできません。Clangは、その実装/メソッドファイルのコンパイルに基づいてインターフェイス/ヘッダーをコンパイルしません。したがって、ヘッダーファイルは、混合コンパイルのARCと非ARCの両方と互換性がある必要があります。私はこれをコンパイラのバグだと考えています。
カーミン、2013年

1
@carmin:そうではありません。コンパイラーは、指示された場合を除いて、ヘッダーファイルを調べません。通常は#import、モジュールファイルからヘッダーファイルを送信するだけです。コンパイラフラグの設定は、各モジュールファイル用です(より正確には、「ソースのコンパイル」ビルドフェーズの各ファイル)。コンパイラーは、他のファイルにARCを使用する必要があるかどうかを知る方法がありません。ただし、最初のモジュールファイルに指定された選択を継承する場合を除きます。
Peter Hosey 2013年

78

これは、ディセーブルにARCに非常に直感的でない方法であるMULTIPLEそれを行う方法を考え出したまで、私はそれを一つずつ実行したがために、ファイル。

  1. XcodeのTarget / Build Phases / Compile Sourcesで目的のファイルを選択(CMD +クリックまたはShift +クリック)
  2. Enterキーを押します(ダブルクリックすると選択がリセットされるため、機能しません)
  3. タイプ-fno-objc-arc
  4. EnterまたはDoneを押します

1
ここでの質問に対する答えではありませんが、とにかく流血のヒントです!+1に投票
クリストフヴァンランドスート

あなたは正しいです、そうではありませんが、私は常にスイッチをググって、この答えがトップヒットの1つだといつも思っています。私は最近、ほとんどの人が答えをすでに知っているが、この「ヒント」は知らないと思った
ティビダボ

35

一部のファイルの自動参照カウントを無効にする場合は、手順に従うだけで簡単に実行できます。コンパイラフラグは、[ターゲット]-> [ビルドフェーズ]-> [ソースのコンパイル]で追加します。

xcode

使用されるフラグは-fno-objc-arcです。書き込み後にEnter キーを押してください。コンパイラフラグの下の行の右側の列をダブルクリックする必要があります。ありがとうございます:)


14
同じ方法で、フラグを使用して、非ARCプロジェクトの特定のファイルでARC を有効にすることができます-fobjc-arc
lnafziger 2012

HEADERファイルでARCコンパイルを無効にすることはできません。Clangは、その実装/メソッドファイルのコンパイルに基づいてインターフェイス/ヘッダーをコンパイルしません。したがって、ヘッダーファイルは、混合コンパイルのARCと非ARCの両方と互換性がある必要があります。私はこれをコンパイラのバグだと考えています。
カーミン、2013年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.