メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2012年6月21日木曜日

[Objective-C][お勉強][メモ] オブジェクトメッセージング

あるオブジェクトに対して何か実行させたいなら、そのオブジェクトに対してメッセージを送るんだそうだ。
その書式は以下。

[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)以外の場合は、返す値は不定。


そんだけ。
.

0 コメント: