ファイル毎に ARC の有効・無効を設定する - Automatic Reference Counting
SPECIAL
ファイル毎に ARC の有効・無効を設定する
ARC (Automatic Reference Counting) を有効にすると、従来のソースコードを大幅に修正する必要がでてくるため、それまでに作成していたプログラムをまるごと ARC に移行するのは、なかなか困難な場合もあると思います。
この ARC を使うかどうかの設定ですが、ARC を有効にする で記したプロジェクト単位での設定の他にも、ファイル単位でも設定できるようになっていました。
ファイル単位で ARC の有効化または無効化は、プロジェクトの "TARGET" の設定で行います。
プロジェクトの "TARGET" を選択したら、そこの "Build Phases" から "Compile Sources" を選択します。
ここで、ARC の有効化や無効化を個別に設定したいソースファイルをダブルクリックして、コンパイラーオプションとして、次の値を設定します。
// ARC を有効化したい場合
-fobjc-arc
// ARC を無効化したい場合
-fno-objc-arc
このようにすることで、"-fobjc-arc" オプションを付けたソースコードは ARC を有効化した状態で、"-fno-objc-arc" オプションを付けたソースコードは ARC を無効化した状態で、コンパイルされるようになります。
ARC コードを ARC ではない環境で間違ってコンパイルしないために
非 ARC のソースコードを ARC 環境でコンパイルした場合には、多くの場合 retain や release のコードがエラーになるので間違うことはないでしょうけど、逆の場合はエラーにならないため注意が必要です。
特に上記のような、ソースファイル単位で ARC の有無を調整している場合には、あるプロジェクトでは ARC を有効化したものの、別のプロジェクトでは有効化し忘れたまま気づかないなどということもあるかもしれません。
ARC を想定して作成したコードを ARC を有効にせずにコンパイルしてしまわないように、ARC が無効の場合にはコンパイルエラーになるようにするのがいいかもしれません。
次のコードをソースコードのどこかたとえば上の方に記載しておくことで、ARC 非対応時にコンパイルエラーとすることができます。
#if !__has_feature(objc_arc)
#error This code needs compiler option -fobjc-arc
#endif
ARC が有効かどうかが大切なのはコンパイルの時なので、このコードはソースコード (".m" や ".mm") のどこかに入れるようにします。
たとえば静的ライブラリなどで、ヘッダーファイルの方に上記のコードを入れてしまっていると、たとえば組み込み先のプロジェクトの ARC が無効なために、静的ライブラリでは正しくコンパイルされているにもかかわらず、使用時にエラーと扱われてしまったりします。
また、Xcode 4.2.1 の場合、コンパイルには成功しても、その後のソースエディタで #error のところが常にエラーとして表示されてしまう場合がありました。その場合はいったんプロジェクトを閉じて開き直せば、コンパイルオプションに合わせてちゃんとエラーが通知されるようになりました。