Objective-Cを勉強してみる - その2

昨日の続き。
ここでお勉強。

メモメモ

  • ラベルが意味不
- (戻り値型)メソッド名 : (引数型) 変数名 ラベル : ....

ラベルとコロンが名前の一部として認識されているため、Objective-C では同じ戻り値、引数、メソッド名を持つメソッドを区別して呼び出すことができるのです。例えば (void)setPoint:(int):(int) というメソッドと(void)setPoint:(int) label:(int) メソッドは異なるメソッドとして宣言、定義することができます。

ほー、これは面白い。

  • 自分自身はself。C++のthisに近い。メソッド内でのみ有効なid型の変数。
  • 親クラスはsuper。変数ではない。スーパークラス保有するクラスのインスタンスメソッド内のメッセージ式でのみ利用可。
  • ちょっ、、、
void CallMethod( id obj ){
    [obj method];
}

int main(){
    CallMethod([SuperClass alloc]);
    CallMethod([SubClass alloc]);

    return 0;
}

これって、コンパイル通るわけ?
objがmethodっていうメソッド持ってなかったらどうすんの?

関数が呼び出すメソッドは、実行時にならなければ最終的な判定はできません。

なにー。なるほど確かに動的。

  • あれ?そういえば、allocしといて解放してない。コンストラクタとかデストラクタがないよ?後から出てくるのかな?
  • コンストラクタは存在しない。代わりにイニシャライザがある。

通常、オブジェクトをインスタンス化した場合は直後に init メッセージを送信しなければなりません。この作業は自動的なものではなく、明示的にメッセージから呼び出さなければなりません。

自動にしてくれればいいのに!><

しかし、new メソッドを使えば上記の文を内部で実行してくれるため、イニシャライザが自動的に呼び出される仕組みを再現できます。

あるんじゃん、、、、

[[クラス名 alloc] init]
+ (id)new;

なるほど、newはクラスメソッド!分かってきた!たぶん。

  • 引数付きイニシャライザはinitWith**とするのが習慣らしい
  • allocしたらfreeで解放!
    • サブクラスでは[super free]を忘れずに。
  • コンパイル時に型の判定を行うには、id型ではなくそのクラス型のポインタを使う。
    • C++と同じ感じになる。
  • インスタンス変数には@public,@private,@protectedの三種の可視性がある。
    • デフォルトは@protected。
    • @publicとか無いものだと思ってたーー。あるんかい。ちょっと幻滅。
  • クラスメソッドはあってもクラス変数はない
  • クラス型が意味不

クラスがインスタンスを生成するように、正しくコンパイルされたクラスは、自らの情報を表すクラスオブジェクトを保有しています。 このクラスオブジェクトは Class 型として、変数に保存することも可能です。

?????。だめだ。寝る。