こんにちは。開発担当の福井です。
先月の WWDC で iOS 7 や OS X 10.9 が発表されましたね。このブログでも何度かお伝えしているのでご存知だとは思います。みなさんはこれらの新しい環境への準備はされていますか?今回は新環境へ対応する際に同時にやっておきたい、ARC へのコンバートについてお話しします。
ARC(Automatic Reference Counting)を有効にする
iOS 7 や OS X 10.9 への対応を機に ARC を利用できる環境になるプロジェクトは多いのではないでしょうか。iOS でいうと、iOS 4.3 の対応を削除するパターンです。ARC とは iOS 5/OS X 10.7 から導入された新しいメモリ管理の仕組みです。従来はプログラマが Retain Count を把握しメモリ管理をする必要がありましたが、ARC ではなんかものすごい仕組みが働いてメモリの管理を自動化することができます。つまり、わずらわしかったメモリ管理から開放されるのです!ARC については横道にそれちゃうので詳しくは自分で調べてみてください。
そんな便利な ARC ですが、従来のモデルから ARC に移行するには変更箇所が多く、骨が折れそうです。そこで、Xcode にはプロジェクトを自動で ARC を使ったものにコンバートできる機能があります。では早速試してみましょう。
“Convert to Objective-C ARC”
Xcode を用いて ARC にコンバートするのは本当に簡単です。具体的にはメニューの “Edit > Refactor > Convert to Objective-C ARC…” を選択し、ウィザードに従ってコンバートを進めます。
ウィザードを終了するとチェックが走り、自動変換できない箇所が列挙されます。そして、それらを解決するだけでコンバートは終了です。すごいですね!さすがにそれだけではあんまりなので、コンバートを実行する前にやっておくといい3つのステップを紹介します。
1. Deployment Target を変更する
まずはアプリの Deployment Target を新しくサポートする環境に変更します。iOS アプリのプロジェクトで iOS 7 の対応を機に ARC が使えるようになる場合だと、以前は iOS 4.3 をサポートしていたパターンが多いのではないでしょうか。実は、iOS 4 や OS X 10.6 でも4.2以降の Xcode でビルドすれば ARC は有効にできます。ただし、限定的にしか利用できません。(ARC Lite といいます)これらの環境では weak 参照が使えず、代わりに unsafed_unretained 参照が指定されます。(余談: weak 参照では参照が切れると自動で nil が代入されますが、unsafe_unretained 参照は nil が代入されません。動きも不安なんですが、なにより名前が不安なんでできれば見たくないですね。)今まで 4.3 をサポートしていて、Deployment Target の変更を忘れていると、いたるところに __unsafe_unretained を挿入されてつらい気持ちになります。該当する場合は、新しく対応する環境に確実に変更しておきましょう。
2. チェックが途中で止まらないようにする
“Convert to Objective-C ARC”ではまず自動変換のためにチェックが走ります。その後自動変換できなかった箇所が列挙されるのですが、Xcode の初期設定だと変換できない箇所をひとつ見つけるごとにチェックが止まってしまいます。毎回止まっていては非効率ですので、設定を変更して途中で止まらないようにしましょう。設定を開き、”General > Issues: > Continue building after errors” のチェックをつけます。
これを設定すると変換できない箇所を見つけてもチェックが止まらなくなります。
3. ARC に変換しないファイルを列挙する
プロジェクトの中にはライブラリなど ARC に変換したくない/できないファイルもいくつか含まれていることでしょう。ARC はファイル単位で有効/無効を設定(プロジェクト内で ARC と非 ARC の混在が可能)することができますので、”Convert to Objective-C ARC” でもファイル単位でコンバートの有無を設定できます。ここで無効に設定すると、そのファイルには “–fno-objc-arc” が付加され、非 ARC としてコンパイルされます。しかし、この設定画面はあまり一覧性が良くありません。事前に対象外のファイルを列挙しておくとスムーズに設定を進めることができます。
この設定画面が残念なので事前に列挙しておかないと、どれを外すつもりだったとか、どれを外したかだとかがすぐにわからなくなってしまいます。対象外にしたいものを事前に列挙しておくと、右上の検索フィールドから効率よく外したいファイルを探し、設定を変更することができます。
まとめ
Xcode の “Convert to Objective-C ARC” と事前にやっておくといいことの紹介をしました。今回紹介したステップを踏んでおくと、あとは自動変換できない箇所の解決に集中できると思います。ついでに Modern Syntax へのコンバートも行うと最近の Objective-C なコードになりますよ;)