iPhone SDK、Objective Cが持つ「進化する能力」の遺伝子
「ウェブ時代5つの定理」の読み方

iPhone SDKとObjective-C:ニートは社会のメモリーリーク?!

 飛行機の中に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];

 少し分解して順番に説明すると、

  1. [MyView alloc] // MyViewクラスのインスタンスを作る
  2. [... initWithFrame:frame] // そのインスタンスを指定した大きさでイニシャライズ
  3. [... autorelease] // そのインスタンスのリファレンスカウントを後で一つ減らすように指示
  4. MyView* view = ... // そのインスタンスへのリファレンスをviewにしまう
  5. [window addSubview:view] // それをwindowの子ウィンドウとして登録する

ということをしているわけだが、重要なのは3番目のautorelease。「アプリケーションがメインループに戻ってからreleaseしてくれ」という意味だが、こうやって新しくオブジェクトを作った後ですぐに誰かにオーナーシップを渡す場合(この場合は親ウィンドウに渡している)、こんな風に「作ってすぐautoreleaseする」ことにより、実質的なリファレンスカウントを持たないローカルリファレンスを持つことができるのだ。

 これは人間で言えば、子供が生まれたとたんに「お前とは親子でもなんでもない。勘当だ。でも大学を卒業するまでだけは家に置いておいてやる」と言うようなもの。生まれてすぐに勘当しておくことにより、大学を卒業してもいつまでも家にゴロゴロしているニートになることを避けているわけである。

Comments

vtake

結局のところ、子供の将来を気にしなきゃならないわけね。

underforest

いつも楽しみに拝見させていただいております。Object-Cのautoreleaseをニートにさせない仕組みと例えた点、納得!っと思ってしまいました。私もiPhone SDKに大変興味を持ってますので、少しずつ勉強してみたいと思っています。

ryu

autoreleaseはCOMの参照カウントに近いかと思いましたが…。
Objective-Cの言語仕様なのか、クラスライブラリの仕様なのかは意識すべきかと思います。

おやじです

Mac OS Xもガーベージコレクションは無かったと思いますが…。

おやじです

>autoreleaseはCOMの参照カウントに近い

というか、そのものです。

はげおやじ

>Mac OS Xもガーベージコレクションは無かったと思いますが…。

Leopardに対応したObjective-C 2.0から採用されてますよ。

おやじです

私が言ったのはOSレベルの話ですけどね。

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)