Ubuntu で Objective-C の ARC を試す

何度目かのiOS開発がついに始まった。しかし、2ヶ月前まで「俺はもうiOS開発なんてしないだろう」と思っていたので、もらったMacBookを元の持ち主がiOS開発をするから返してくれると有難いと言われ、ホイホイ返却してしまった。

さて、最近のことだが、Objective-Cにすさまじい変化が訪れた。ARC(Automatic Reference Counting)だ。俺は元々、PythonPHPJavaなどのメモリ管理にルーズでも許される言語ばかりを使ってきたため、Objective-Cのretain, releaseにかなり悩まされてきた。前の開発では最後の方はだいぶわかってきたが、「なぜかここはreleaseを2回やるとうまくいく」みたいなものが多かったし、メモリリークは最後までなくならなかった。ARCはそれを勝手にやってくれるとのことで、非常にうれしい限り。ただ、これはまだまだノウハウがたまっていないらしく、癖などを把握する必要がある。

実は、Objective-Cを使うのに限れば、MacとXcodeは必ずしも必要ない。Xcodeで使われているコンパイラ「clang」はオープンソースで、誰でも使うことができる。もちろんARCも使える。ただし、Appleが提供しているフレームワークが使えないため、iPhoneのアプリは作れない、というわけだ。

ということで、今あるUbuntu 10.10の環境でARCを使ってみた。ARCに対応したclang 3.0はUbuntu 12.04で採用予定のため、apt-getでポンとはいかない。全てをビルドして動かすことにする。

1.llvm-clangのビルド

http://clang.llvm.org/get_started.html

のとおりにやる。最後にsudo make install。

途中のconfigureを../llvm/configure --enable-optimizedとするとリリース版がビルドされる。

さて、これだけではNSString, NSMutableArrayなどでいろいろ作ることができない、具体的には「詳解Objective-C 2.0 第3版」のサンプルを動かすことができないので、それらが入った「GNUStep」をインストールする。

2.GNUStepをclangでビルド

2.1.ソースをとってくる

svn co http://svn.gna.org/svn/gnustep/ gnustep

2.2. ビルドする

http://wiki.gnustep.org/index.php/Building_GNUstep_with_Clang

の4,5,6を行う。3はGCを使わないのでいらんと判断した。

2.2.4 gnustep-makeをインストールする

cd gnustep/modules/core/make

./configure CC=clang LD=gcc && make CC=clang LD=gcc

sudo make install

2.2.5 libobj2のインストール

cd ../../dev-libs/libobjc2/

make CC=clang LD=gcc CXX=clang++ messages=yes

sudo make install

2.2.6 coreのインストール(guiとかもあるが、使いたいのはFoundation Frameworkだけなのでだるい!)

cd ../../core/base/

./configure CC=clang CXX=clang++ LD=gcc && make CC=clang LD=gcc CXX=clang++ messages=yes

おっと、こりゃダメだ!

http://www.gnustep.org/resources/documentation/User/GNUstep/gnustep-howto_2.html#SEC2

のライブラリが足りてないと動かないぞ!

自分はffiが足りなかったので、適当にaptで入れた(本当はffcallってのをビルドする必要があるらしい) 

再度試したら成功。

sudo su

 . /usr/local/share/GNUstep/Makefiles/GNUstep.sh(パスがページのものと違っている)

make GNUSTEP_INSTALLATION_DOMAIN=SYSTEM install

3.いろいろ試す

http://www.moonmile.net/blog/archives/2252

のテスト用ファイルをコンパイルしてみる。

http://wiki.gnustep.org/index.php/ObjC2_FAQ

http://qanda.rakuten.ne.jp/qa6407252.html

などを参考にいろいろ追加して、このオプションで動いた。

clang -lobjc -lgnustep-base -fobjc-nonfragile-abi -fconstant-string-class=NSConstantString test.m

4.ARCに挑戦

いよいよARCを試すときが来た。

clang -lobjc -lgnustep-base -fobjc-arc -fobjc-nonfragile-abi -fconstant-string-class=NSConstantString test.m

としてARCを有効にすると、「deallocするな」「releaseするな」などとなかなか好感触。

deallocやreleaseを抜いて、autoreleasepoolを新しい形式にして再コンパイルすると、ARCへの一歩を踏み出せたようだ。