GNUstep版のObjective-CはApple純正版のようにはいかない

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

数日前にpaizaオンラインハッカソン6を自身の本来の得意分野 ((元々iOSアプリの開発をメインに行っているため)) であるObjective-Cで回答してみたのだが、paizaで提供している環境がAppleのCocoa/Cocoa Touchフレームワーク ((以後、両者をまとめてCocoaフレームワークと表記する)) ではなく、GNUstepというクロスプラットフォーム・フリーのフレームワークを採用していることが原因で、回答にかなり戸惑った。ここではApple純正版とGNUstep版で注意しなければならない点をいくつか挙げてみたい。

GNUstep版ではAutomatic Reference Countingは使えない

Cocoaフレームワークでは、iOS 5及びOS X Lion以降 ((機能限定版を含めればiOS 4.2及びSnow Leopardも含まれる)) ではAutomatic Reference Counting(ARC)というコンパイル時に自動的にretain, release, autoreleaseなどを行う機能が追加されており、Xcode 5以降では新規プロジェクト作成時は強制的にARCが有効になるほどだが、GNUstep(少なくともpaizaのテスト環境)ではそうではない。

これは近年ARCを使用することを前提にアプリを開発している方は特に要注意だが、Objective-CではARCまたはガベージコレクションを使用している場合を除けば手動でメモリー管理を行わなければならない。alloc〜initやretain、copyなどを行った場合は不要になった時などにreleaseをかけなければメモリーリークを起こすということである。

Modern Objective-C Syntaxの一部が使えない

CocoaフレームワークではXcode 4.4以降でModern Objective-C Syntaxと呼ばれる記述を簡潔にできる便利な機能が追加されたが、GNUstep版では使えない。例えば以下のコードがある。

[code lang=”objc”]NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[@"foo"] = @"bar";[/code]

上記のコードは近年のXcodeを使っている場合は問題なくビルドが通るが、GNUstep版ではコンパイルエラーが発生する。これを問題なく通すようにするためには以下のように書かなければならない。

[code lang=”objc”]NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"bar" forKey:@"foo"];[/code]

また、GNUstep版ではプロパティーの自動synthesizeや@implementationでのメンバ変数定義などの機能も扱えないため、近年Xcodeを使ってiOSやOS Xのアプリを開発している人はその点も気をつけなければならない。

実例

今回、paizaオンラインハッカソンの解答例コードを以下に挙げた。

上記ではそれぞれGNUstep、Macの環境に合わせて記述を行ったが、同じ処理でも書き方を変えなければならない箇所がいくつかある。概ねCocoa版の方が簡潔に記述できる一方、GNUstep版は冗長な記述を強いられる傾向にあることが容易に想像できる。

最後に

今回の記事はiOS及びOS X向けのアプリのみを開発しているのであればそれほど問題にならないが、GNUstepなど、サードパーティーのフレームワークなどを使用している時に気をつけなければならない点を記述してみた。

iOSやOS Xのアプリを開発している上ではあまり意識することはないが、GNUstepなどが絡んだ時に「なんでコンパイルが通らないの?」という事態に直面することがあるかもしれないだろう。その時、そのコードをどうやったら動くようになるのかを考えてみると良いだろう。

個人的にはレガシーなコード、特にdeprecatedなコードを書くのは望ましいことではないと考えているが、環境によってはそれしか方法がない場合もあるので、モダンな書き方は当然としても、それができない場合に備えてレガシーな方法で書いた場合はどうなるのかを考えるのも必要になるだろう。

タイトルとURLをコピーしました