ARC コードと従来のコードの混在について - Automatic Reference Counting
SPECIAL
ARC コードと従来のコードの混在について
ARC (Automatic Reference Counting) を有効にすると、従来のソースコードを大幅に修正する必要がでてくるため、それまでに作成していたプログラムをまるごと ARC に移行するのは、なかなか困難な場合もあると思います。
そこで、どのようにしたら ARC のコードとそうでないコードとを混在させることができそうかについて、考えてみたいと思います。
まず、ソースコードレベルであれば、必要な個所を適宜プリプロセッサで、次のようにコードを分離することは可能です。
#if __has_feature(objc_arc)
// ここで ARC が有効の場合のコードを記載します。
#else
// ここで ARC が無効の場合のコードを記載します。
#endif
ただ、この方法では、ソースコードが読みにくくなるのと、ARC が有効の場合とそうでない場合との、2 つの場面を想定してプログラミングをしないといけないため、ARC のメリットを生かすという視点から見ると、むしろ逆行してしまうようにも思えます。
別の方法としては、ARC コードとそうでないコードとを分離するひとつの方法として、静的ライブラリに分離するということも可能なようです。
これまでの ARC に対応していないコードをまとめて静的ライブラリを作成して、それを ARC を無効にしてコンパイルします。そして ARC に対応したコードは順次、ARC を有効にしたアプリケーションプロジェクトに移行して行きます。
静的ライブラリは ARC が無効なので、メモリ管理は retain や autorelease を使用することになりますけど、そうやって管理されたオブジェクトを戻り値として渡しても、ARC はそれを適切に受け取って、管理することができるようになっています。
クラスのプロパティ宣言で使用する "assign", "retain", "copy" についても、ARC では扱えるようになっているので、静的ライブラリのヘッダーファイルを ARC 対応のプロジェクトに組み込んだとしても、エラーや誤動作の原因になることはない感じです。