オブジェクトを初期化する - Cocoaプログラミング

インスタンスを生成するには、まず初期化です。おぎゃあ。

てくっち

「オブジェクトを作ろう」の項で作ったHumanクラスを使って説明します。

てくっち

Humanクラスのインスタンスを生成するには、こうします

てくっち

Human *wada = [[Human alloc] init];

てくっち

こうすると、新しく誕生したインスタンスへのポインタが、変数wadaに入ります。

てくっち

この書き方、[ ]がなんだか入り組んでて複雑だと思ったひとー

てくっち

3つのことを1行にまとめてるんですよこれは。

てくっち

Human *wada;
wada = [Human alloc];  
[wada init];

てくっち

Humanクラスのインスタンスへのポインタを格納できる変数wadaを宣言し、

てくっち

Humanクラスのインスタンスを1つ、メモリに割り当ててwadaに先頭アドレスを格納し、

てくっち

そのインスタンスをイニシャライズ。

てくっち

厳密に言うと、最後のやつの返り値がwadaに入るんですが、[Human alloc]で割り当てたアドレスと同じものを返すことになってるので

てくっち

これで問題ないかと。

和田

ぜんぜん意味が…。わかりません…。

てくっち

むぅ!

てくっち

Human *wada;

てくっち

これはいいっすよね?

てくっち

int i;

てくっち

と同じ感じで。

てくっち

NSString *s;

てくっち

Cocoaが用意したクラスでも同様に。

てくっち

クラス名 *変数名;

てくっち

というかたちです。

てくっち

この時点では、変数のタイプを宣言しただけで、まだインスタンスはできていません。

てくっち

[Human alloc];

てくっち

[クラス名 alloc];

てくっち

これは説明してこなかったことですが、インスタンスを生み出すには、こうやるんです。

てくっち

返り値として、インスタンスが割り当てられたメモリの先頭アドレスが返ってくるので、

てくっち

wada = [Human alloc];

てくっち

などと変数に入れておきます。これをしないと、二度と参照できなくなりますから。

てくっち

そして最後の段階。できたてのインスタンスを、初期化します。

てくっち

[wada init];

てくっち

以上3つのステップは定型的なもので、しょっちゅうやることですから、次のように一気に書くのが習慣です。

てくっち

Human *wada = [[Human alloc] init];

てくっち

見慣れてくれば、なんかわかってきたような気に・・・なりませんか!

てくっち

クラス名が長い場合などは、

てくっち

Human *wada;
wada = [[Human alloc] init];

てくっち

と2つに分けることもよくあります。