カスタム検索

2008年12月17日水曜日

いまさら聞けない「Objective-C」超入門 Objective-C その4

そんなこんなで第4回。

動的結合ってなんじゃ?
・存在しないメソッドを実行しようとしたコードを書いた場合に、コンパイル時にエラーが出ず、実際に実行したときにメソッドが実行出来るかを確認する方式を「動的結合」と呼ぶ
・Javaは比較的静的結合、Groovyみたいにダイナミックに扱う場合は動的結合、という認識でいいのかな?

Object は id として扱うとしてきたが、普通にクラス名で宣言してもよい

Class Fooがあったとして
id c;
c=[Foo alloc];

Foo *c;
c=[Foo alloc];
どちらでもFooのインスタンスを作成出来る。

クラス名をしておくと、不正なクラス利用をされていた場合にコンパイル時にチェックしてくれる。
ダイナミックにクラスが変わる場合は id を使うって事ね!

nilについて
・nilはポインタが空の状態、NULLとは違う
・Classのinitに失敗した場合等に nilとなる
・JavaでNullになんかすると NullPointerException が出るが、 nil にメッセージを送ってもエラーにならない(ただしプログラム上ではわかりやすくする為に nil 判定を書いておく事は重要)

インターフェース内のクラス指定について
Objectの中に別のClassを持つ場合、 importして書く事も出来るが、通常は @class 宣言を使う。


@class Hoge;

@interface Foo : NSObject {
Hoge *ho;
}


HogeはClassだよと教えてやるわけです。ただし実装部では import する必要があります。

変数hogeにgetter , setter を定義する場合
-(int)hoge;
-(void)setHoge:(int)value;
getterにはgetを付けない!

Class型って?
・インスタンス化されたものじゃなくて、元となるクラス
・NSObjectに用意された class を呼ぶと、そのクラスのClass型を取得できる
これを使って動的にクラスを割り当てるサンプル!

Class theClass = flag ? [Foo class] : [Hoge class];
id v = [theClass alloc];


flagがtrueなら v はFooのインスタンスになり、falseなら v はHogeのインスタンスとなる。

インスタンスのクラスが指定したクラスのインスタンスかをチェックするには isMemberOfClass を使う。
BOOL isFoo = [v isMemberOfClass:[Foo class]];
v がFooのインスタンスであれば isFoo は true となる。

クラスメソッドとは?
・Javaでいうところのstaticメソッド?
・NSObjectには、class とか isMemberOfClass とか、alloc がクラスメソッドとして定義してあるため、上記のように使える
・自分でクラスメソッドを定義するには、今まで - と書いてた所を + と書く
例:allocの定義
+(id)alloc;

クラス内から、自分のクラスメソッドを呼ぶとき等は、
[[Foo alloc] say];
と書いてしまうと、Fooを継承したクラスで不都合が起きてしまうので
[[[self class] alloc] say];
とすれば、必ず呼ばれた時のクラスのクラスメソッドを呼ぶ事が出来る。

今日はこの辺りで・・・、次回はやっとメモリ関係

0 件のコメント: