うーんMacOSX

WindowsでC++やっていると、Cocoaの開発がしたくなります。

なんだか、WindowsだとAPIがCのためにある感があるのですが
MacOSXのCocoaだとObjective-CがAPIのためにある感覚があります。
(フレームワークがオブジェクト指向的だからかもしれませんが)
まあ、兎に角書いていて楽しい。

Objective-Cでは、インスタンスメソッドを呼び出す時は次のようにします。
戻り値 = [インスタンス名 メソッド名:引数 引数2名:引数2];

例えば文字列を扱うときは、NSStringというクラスを使います。
NSStringクラスをインスタンス化しましょう。
NSString* string = [[NSString alloc] init];

NSStringには様々なメソッドが用意されています。
例えば文字列比較のメソッド(BOOL)isEqualToString:(NSString*)を使うと次のようになります。
if( [string1 isEqualToString: string2] )
{
NSLog(@”一致”);
}

クラスを作るときにデリゲートをよく使います。
別のクラスのポインタをもらっておき、自分のクラスのメソッドでそれを使います。
他の言語でもよくやることですが、インスタンスに自分のポインタを渡しておくのと同じです。
ただし、インスタンス側からは呼び出したいメソッドがあることが確定している必要はありません。

例えば、インスタンスポインタinstanceから、paint:メソッドを呼び出したい。
でもinstanceにpaint:メソッドがあるのかどうかは分からない。(hファイルに宣言していない)
[C++]だとこんな具合。
 instance->paint();
[Objective-C]だとこう。
 [instance paint ];

大抵の言語では、instanceにpaintメソッドが実装されていないのに呼び出そうとすると、コンパイル時に「そんなメソッド見つからないぞ」とエラーが起きるのですが、Objective-Cは実行時に動的にオブジェクト同士でメッセージを送り合う言語なのでエラーになりません。つまり、未実装であればクラッシュします。
それを避けるために次のメソッドを用います。
-respondsToSelector:

こんな感じで使う
if( [instance respondsToSelector:@selector( paint )] )
{
 [ instance paint ];
}

こうすることで、メソッドがあれば実行して、実装されてなければスルーしてくれるようになります。
HTMLやCSSを書くときに、必要な命令だけ書けばあとの情報はブラウザが補完してくれますよね。
同じように、呼ばれる予定のメソッド全てを実装しなくても、必要なメソッドだけを書けば、呼び出し側が何とかしてくれるという気楽さを可能にするのです。この機能で汎用性が高くなります。

ねむい