あるオブジェクトに対して何か実行させたいなら、そのオブジェクトに対してメッセージを送るんだそうだ。
その書式は以下。
[receiver message];
これを「メッセージ式」というらしい。
receiver は、メッセージを受信するオブジェクト。
messageは、receiverが実行すべきこと。
ランタイムシステムはメッセージが送信されると、receiverの持つ全てのメソッドの中から適切なメソッドを選んで呼び出す。
なので、message部分はreceiverのメソッド実装を「選択」することから
セレクタと呼ぶこともあるとのこと。
message部の書き方
AオブジェクトのBメソッドを実行する場合
[A B];
Aオブジェクトの引数1つのBメソッドを実行する場合
メソッド名の直後にコロンを置いて、その直後に引数の値を指定する。
[A B:10];
Aオブジェクトの複数の引数を持つBメソッドを実行する場合
2つ目以降の引数には引数名とコロン、そして引数の値を指定する。
[A B:10 C:20 D:30];
セレクタ名(Javaで言えばシグネチャ?)は、メソッド名とパラメータ名で成る。
上記の例だと
B:C:D:
となるとのこと。コロンが3つあるのは引数を3つ取るため。
戻り値や引数の型はセレクタ名には含まれない。
Aオブジェクトの可変引数を持つBメソッドを実行する場合
コロンの後にカンマで区切って指定する。
[A B:10,20,30];
セレクタ名にはカンマは含まれない。
なので[A B:10,20,30]のセレクタ名は
B:
となる。
値を返すメッセージ式
メッセージ式で指定されたメソッドが値を返す場合、メッセージ式は値を返すことができる。
A = [B C];
BオブジェクトのCメソッドを実行した結果、その戻り値をAに代入。
メッセージ式の中にメッセージ式
メッセージ式はネストできるので以下のように書くことができる。
[A B:[C D]];
上記は、CオブジェクトのDメソッドの戻り値をAオブジェクトのBメソッドのパラメータとしている。
nilへのメッセージ
nilへメッセージ送信可能。
nilへのメッセージパターン
1) メソッドがオブジェクトを返す場合、nilを返す。
ObjB *objB = nil;
ObjA *objA = [ObjB methodReturnsObjA];
の場合objAはnil。
2) メソッドが以下の型を返す場合、メソッドは0を返す。
ポインタ型、sizeof(void*)以下のサイズの整数スカラ、float、double、long double、long long
@implementation ObjA;
- (float)methodReturnsFloat;
の場合、
ObjA *objA = nil;
[objA methodReturnsFloat];
は、0.0を返す。
3) メソッドがstructを返す場合は、そのstructのすべてのフィールドに0.0を返す。
4) 上記、1)〜3)以外の場合は、返す値は不定。
そんだけ。
.
メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。
2012年6月21日木曜日
[Objective-C][お勉強][メモ] オブジェクトメッセージング
投稿者 atkonn 時刻: 3:12:00
ラベル: Objective-C, お勉強, メモ
登録:
コメントの投稿 (Atom)
0 コメント:
コメントを投稿