Objective-C++で作って、話して、壊す

現在学習中のObective-C++についてのエントリーです。記載した情報が必ず正しいとは限らないことにご留意してお読みください。「間違ってるよ!」等の突っ込み大歓迎です。(突っ込みはコメント欄にお願いします。)

「Objective-C++でクラスを作る」でサンプルとして用いた上記クラスの「インスタンスを作って」、「話しかけて」、「壊す」には、例えば以下のようなコードを書けばよい。

id rect_01 = [Rectangle alloc]; // 作って
int area = [rect_01 getArea]; // 話して
[rect_01 release]; // 壊す

話す

Objective-C++では、メッセージパッシングは、

[インスタンス メッセージ]

の形式で記述する。C++,C#,Java界隈とはだいぶ異なる形式だ。既存の価値観にとらわれる傾向の強い小生は、Objective-C++に触れ始めた頃は、何度も鼻の奥がむずかゆい感覚に襲われてしまった。(この表記は、元祖OOPLのSmalltalk文化周辺が起源となっている?)

作って壊す

注:このセクションに記述されている内容は、メモリ関係のトピックのほんのさわりです。(本エントリ最後尾記載の補足にもお目通しください。)

Objective-C++でインスタンスを生成する際には、C言語文化圏の方には、お馴染みの「alloc」を用いる。C言語と同様、ヒープメモリに領域を確保するようだ。(ヒープ領域以外の領域にインスタンスを確保する方法は、見つけられなかった。)

「ヒープ領域に生成したインスタンスは解放する」のが紳士のたしなみ。ということで、紳士道を日々邁進している小生も、当然そのたしなみを実践したい。 「alloc」で確保した領域の解放には、「release」を用いる(C言語派には残念だが、「free」ではない)。

ちなみに、「alloc」も「release」も定義していない「Rectangle」クラスに対し、これらのメッセージを発行し、その結果、実行していただけるのは、 下図のように「Rectangle」クラスを「NSObject」クラスのサブクラスとして定義しておいたおかげである。

idと緩やかさ

「alloc」の返り値の型は「id」。この「id」という型は、「オブジェクトである」ことを示す型とのこと。

なお、Objective-C++は、C++やJavaに比べてコンパイル時の型チェックが緩やかなようで、

[rect_01 getAera];

といったように、Rectangleクラス(とそのスーパークラス)には定義されていないメッセージを発行してもコンパイル時にはエラーとして扱ってくれない(実行すると落ちる)ので注意が必要。(オプションの設定次第かもしれないが、)警告はしてくれるようなので、きちんと警告には目を通すべき。なのだが、たまにこれを怠り、落ちる要因を特定するのにしばしの時間を取られてしまうお間抜けな小生。猛省が必要である。

Ruby周辺の文化にも通じるこの緩やかさは、うまく利用してやれば、汎用性の高いコードを書きやすくなるという嬉しさがあるのだろう。(「緩やかさなどは認めん!厳格であれ!緩やかさなぞ粛正せよ!」派もいらっしゃるでしょうが。)

なお、以下のように「id」は利用せず、C++っぽいスタイルでコードを書くことも可能。(既存の価値観にとらわれる傾向の強い小生は、こちらのスタイルを主に利用。)

Rectangle* rect_01 = [Rectangle alloc];
int area = [rect_01 getArea];
[rect_01 release];

メモリの補足

話を単純化するため、本エントリーでは「alloc」したインスタンスに対し、「release」すれば解放できると記述した。が、「参照カウンタ」という仕組みが用意されていて、「alloc」後に「retain」というメッセージを発行すると、その後「release」しても解放されない模様。
しかし、小生、この「参照カウンタ」という仕組みを使わずして「alloc」「release」を対に使う古典的かつシンプルな方法のみでiPhoneアプリを作ってしまった。そのため、この仕組みのメリット/デメリットを語れる程の造形がないでそうろう。申し訳ない。面目ない。
また、「参照カウンタ」以外にも、「オートリリース」という機構やジャバラーにはお馴染みの「ガーベッジコレクタ」も用意されているらしい。(ただし、ガーベッジコレクタはiPhoneアプリ向けには使えないという噂を聞いている。)ご興味のある方は、これらのキーワードについてもご調査くださいませ。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中