Objective-C 2.0は移行する価値あるか?

Leopardの調子がいい。Appleの喧伝によれば、新OSを発売したときは毎回そうなのだが、今までに最も売れたMac OSであり、300の新機能がある。何もこれらの数字をあげなくとも、今までの積み重ねの上に、「使いやすさ」というMacの永遠の命題を追求し続けていることは、ユーザの方なら感じ取れるだろう。

さて、そんなMac OS Xを支えるものと言えばアプリケーションフレームワークCocoaであり、そのCocoaを支えるものと言えばプログラミング言語Objective-Cである。もはやCocoa専用言語の感もあるObjective-Cだが、登場から長い年月が経ち、いささか古くさく見えるのも確かだ。そこで、LeopardではObjective-Cのオーバーホールが行われ、Objective-C 2.0という名称とともにバージョンアップを遂げたのだ。

なかなか刺激的な名前だが、実際の使い勝手はどうなのだろうか。Objective-C 2.0の新機能としては、次の3つを挙げることが出来る。

  • ガベージコレクション
  • プロパティ
  • Fast Enumeration

この特集では従来のObjective-CからObjective-C 2.0への移行を考察する、という視点で、この新言語を詳しく紹介しよう。

ちなみに、本稿ではAppleの表記にならい、Objective-C 2.0に対して、従来のものをObjective-C 1.0と呼ぶことにする。

Objective-C 2.0を有効にする

まず、Objective-C 2.0を使う環境を整えよう。とは言っても、Leopard + Xcode 3.0の環境(概要はこちらの記事を参照)では、デフォルトでObjective-C 2.0が使用可能になっている。逆に言えば、ランタイムをObjective-C 1.0として動作させることは出来ないようだ。Objective-C 2.0は後方互換になっているので、問題はないだろうが。

Xcodeのビルド設定のうち、Objective-C 2.0に関するものは、ガベージコレクションの有効化だ。ガベージコレクションのオン/オフは切り替えることができ、3つの選択肢がある。「サポートなし」「サポートあり」そして「必須」だ。

ガベージコレクションの設定

ガベージコレクションは、ランタイムが起動するときにオン/オフが行われる。「サポートなし」ならオフ。「サポートあり」または「必須」ならばオンになる。

気を付けなくてはいけないのは、プラグインのような他のアプリケーションに読み込まれるタイプのバイナリだ。プラグインと、それを読み込むアプリケーションとの間で、ガベージコレクションの要/不要があっている必要がある。もしプラグインを「必須」でコンパイルした場合、アプリケーション側でガベーコレクションが有効である必要がある。プラグインが「サポートあり」の場合は、どのアプリケーションでも読み込むことができる。

また、ターゲットにも注意しよう。Objective-C 2.0の文法は、Leopardのgccでしかコンパイルできないし、コンパイルされたコードは、LeopardのObjective-Cランタイムでしか動作しない。Xcodeでは、どのバージョンのMac OS Xをターゲットとしてコンパイルするか指定出来るのだが、ここでLeopardよりも前のバージョンを指定すると、Objective-C 2.0のコードはビルドが通らなくなる。

コンパイル時にはLeopard(Mac OS X 10.5)を指定しなければならない

これらのことを考慮して、Objective-C 2.0に移行するかどうか、検討するようにしよう。