CHAPTER07 NSObject クラスとランタイムシステム
クラスとインスタンス
NSObjectはisaというクラス型の変数を一つだけ持っている。isaは自分の属しているクラスオブエジェクトを参照しています。
このisaは直接変更や調べることはしないで。インスタンスメソッドのclassを使ったりする。
[Class class];レシーバーの属するクラスを返すインスタンスメソッド。
同じようにクラスイメソッドもある。
レシーバー自身を返すメソッドもselfというのがある。(何もしないメソッドみたいな感じ)
■メッセージ送信の仕組み
セレクタ(メソッド名)はコンパイル時に内部表現に変換されます。この内部表現に対応するデータ型をSEL型と呼ぶ。
プログラム上からセレクタ内部表現を扱うために、@selectorというコンパイラ指示子を使ってお子なる。
SEL型を使ってメッセージの送信をすることもできて、performSelctorメソッドを使う。
SEL = method = (hanteishiki) ? @selector(activate:) : @selector(hide:); id obj = (hanteishiki) ? a : b; [target performSelctor:method withObject:obj];というように、呼ぶ出されるメソッドを実行時に決定できる。
存在しないセレクタを指定してもエラーにならないから、-Wundeclared-selectorというオブションをつけてコンパイルするとチェックが出来る。
メッセージ探索
何度も同じメッセージを送るとき、ランタイムシステムはあるクラスのあるセレクタに対応するメソッド持っていて、その定義場所はどこかをキャッシュしています。
オブジェクトのもつメソッドに対応する関数へのポインタはIMP型で表現される。これを使って直接間接を呼ぶことができる。
selfへの代入
initでselfに対して代入する形でやってるのは、self以外を返す可能性があるから。
// 引数なしのイニシャライザの実装
- (id)init {
self = [super init];
if (self != nil) {
// 初期化
}
return self;
}
クラスオブジェクトとルートクラス
クラスオブジェクトのクラスに相当するメタクラスという概念がある。任意のクラスオブジェクトがルートオブジェクトを継承したメタクラスのインスタンスであるとみなせて、
このことよりクラスオブジェクトはルートオブジェクトのインスタンスメソッドを実行できると言うことを意味している。
NSObjectのインスタンスメソッドとして定義されている、performSelctorなどを利用できるなど。
ターゲットアクションパラダイムという概念で、オブジェクト志向っぽい話。
■新しいランタイムシステム
64bitのランタイムとiOSのランタイムをモダンランタイム32bitのランタイムをレガシーランタイムと呼んでいる。
64ビットモデルと整数型
Cocoa環境ではNSInteger型を導入して、32bit環境ではint型、64bit環境ではlong型であるように定義している。printfなどの型の違いで指定が変わるものは、キャストするなどそういうbit別のマクロ書いて対応してるみたい(apple的に)
CoreGraphocsではfloat型とdouble型がありましたが、CGFloatがたを導入して意識しなくてもいいようにしたみたい。
コメント(0件)
- TB-URL http://efcl.info/adiary/0131/tb/