Ubuntu で Objective-C の ARC を試す
何度目かのiOS開発がついに始まった。しかし、2ヶ月前まで「俺はもうiOS開発なんてしないだろう」と思っていたので、もらったMacBookを元の持ち主がiOS開発をするから返してくれると有難いと言われ、ホイホイ返却してしまった。
さて、最近のことだが、Objective-Cにすさまじい変化が訪れた。ARC(Automatic Reference Counting)だ。俺は元々、PythonやPHP、Javaなどのメモリ管理にルーズでも許される言語ばかりを使ってきたため、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への一歩を踏み出せたようだ。