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 対応のプロジェクトに組み込んだとしても、エラーや誤動作の原因になることはない感じです。

[ Automatic Reference Counting 目次へ ]