iPhone SDKとObjective-C:ニートは社会のメモリーリーク?!
2008.03.10
飛行機の中に9時間ほどネットもテレビもない環境に閉じ込められていたおかげでObjective-CとiPhone SDKの勉強もとても良くはかどり、簡単なアニメーションぐらいアプリなら作れる様になったし、Objective-Cでプログラムを書くことにもだんだん違和感がなくなってきた。
しかし理解が進めば進むほど分かってくるのがiPhoneがいかに他の携帯電話と比べて進化しているかということ。OS Xの不要な部分はばっさりと切り捨てつつ、Objective-Cの拡張性を最大限に利用したとても完成度の高いものとなっている。
特に良くできているのが、iPhone特有のユーザーインターフェイスを実現するために仕組みと、メモリ消費と電力消費を抑えるための仕組み。特に、バーチャルメモリの仕組み、リードオンリーリソースの扱い、ハードウェアアクセラレータの活用、アプリケーションプロセスの扱いなど、それぞれが徹底的にまでiPhone向けにオプティマイズされている。
こういう設計を見ると、モバイル端末でWindows Vistaをそのまま動かすことがどのくらい無謀なことかがはっきりと認識できる。よほど大改造をしない限り、電池が持たない。
ちなみに、iPhone OSはMac OS Xと異なりガベージコレクションをサポートしていないが、autoreleaseという仕組みでC++のスマートポインターと同じような効果を実現しているが。それが妙に気に入ってしまった私。
具体的には、こんな感じでコードを書く。
MyView* view = [[[MyView alloc] initWithFrame:frame] autorelease];
[window addSubview:view];
少し分解して順番に説明すると、
- [MyView alloc] // MyViewクラスのインスタンスを作る
- [... initWithFrame:frame] // そのインスタンスを指定した大きさでイニシャライズ
- [... autorelease] // そのインスタンスのリファレンスカウントを後で一つ減らすように指示
- MyView* view = ... // そのインスタンスへのリファレンスをviewにしまう
- [window addSubview:view] // それをwindowの子ウィンドウとして登録する
ということをしているわけだが、重要なのは3番目のautorelease。「アプリケーションがメインループに戻ってからreleaseしてくれ」という意味だが、こうやって新しくオブジェクトを作った後ですぐに誰かにオーナーシップを渡す場合(この場合は親ウィンドウに渡している)、こんな風に「作ってすぐautoreleaseする」ことにより、実質的なリファレンスカウントを持たないローカルリファレンスを持つことができるのだ。
これは人間で言えば、子供が生まれたとたんに「お前とは親子でもなんでもない。勘当だ。でも大学を卒業するまでだけは家に置いておいてやる」と言うようなもの。生まれてすぐに勘当しておくことにより、大学を卒業してもいつまでも家にゴロゴロしているニートになることを避けているわけである。
結局のところ、子供の将来を気にしなきゃならないわけね。
Posted by: vtake | 2008.03.10 at 06:48
いつも楽しみに拝見させていただいております。Object-Cのautoreleaseをニートにさせない仕組みと例えた点、納得!っと思ってしまいました。私もiPhone SDKに大変興味を持ってますので、少しずつ勉強してみたいと思っています。
Posted by: underforest | 2008.03.10 at 09:04
autoreleaseはCOMの参照カウントに近いかと思いましたが…。
Objective-Cの言語仕様なのか、クラスライブラリの仕様なのかは意識すべきかと思います。
Posted by: ryu | 2008.03.10 at 18:28
Mac OS Xもガーベージコレクションは無かったと思いますが…。
Posted by: おやじです | 2008.03.14 at 23:42
>autoreleaseはCOMの参照カウントに近い
というか、そのものです。
Posted by: おやじです | 2008.03.14 at 23:44
>Mac OS Xもガーベージコレクションは無かったと思いますが…。
Leopardに対応したObjective-C 2.0から採用されてますよ。
Posted by: はげおやじ | 2008.03.15 at 13:56
私が言ったのはOSレベルの話ですけどね。
Posted by: おやじです | 2008.03.16 at 03:59