libro
www.tuyano.com
初心者のためのObjective-Cプログラミング入門

クラスを更に考える (3/8)

作成:2011-02-08 11:33
更新:2011-11-13 16:05

■id型と動的結合・静的結合

今回は、main関数でもう1つ新しいものを使っています。よく見ると、MyTestClassインスタンスを変数に設定するのに、こんなことをしていますね。

id obj = [MyTestClass
        myTestClassWithMessage:
        @"This is First Object!!"];
変数objは、MyTestClassポインタではなく、「id」というタイプとして用意されています。この「id」型というのは、Objective-Cでとてもよく見られる新しいタイプなのです。

id型というのは、「Objective-Cで登場するインスタンスを保管する汎用的なタイプ」です。id型は、インスタンス全般を設定することができます。インスタンスを保管するための、あらゆる「クラスのポインタ型」の代わりとなるものです。

id型として宣言された変数には、どのようなクラスのインスタンスも保管することができます。「MyTestClass* obj」として宣言したら、objにはMyTestClassインスタンスしか入れることができません。が、「id obj」とすれば、objにはどんなクラスのインスタンスでも入れることができるわけです。

普通、こうした変数というのは、プログラムのコンパイルをするときに「この変数にはこのクラスのインスタンスが入る」ということをきちんと考えてプログラムが作られるようになっています。つまり、できあがったプログラムでは、指定のタイプの値が設定されて動くようになっているわけですね。こうしたものを「静的結合」といいます。

これに対し、id型は、プログラムをコンパイルしてプログラムが作られた段階でも、まだその変数にどういう値が入れられるが決められていないのです。プログラムを実行したとき、その場で「じゃあこれを入れるってことで」と決めることができます。こうしたやり方を「動的結合」といいます。

動的結合は、非常に柔軟に変数に値を設定することができます。が、プログラムを作るときにはまだどういう値が設定されるかわからないため、その時点で問題のある値が設定されていてもそのままプログラムは作成されてしまいます。つまり、「コンパイル時に設定される内容の正しさがチェックできない」のです。したがって、できたプログラムを実際に動かしている最中に、いきなり強制終了……なんて事態になりかねないこともあります。

このように、id型はメリットとデメリットがある「諸刃の剣」なのです。まぁ、とても便利で扱いが楽ちんなので、慣れないうちは何でも全部id型にしてしまう傾向があります。が、プログラムをより厳密に作成するということでいえば、静的結合ですむ場合はid型は使わないようにしたほうがいいでしょう。両者をうまく使い分けるのが、id型の使いこなしのコツといえるでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※main関数の内容

int main (int argc, const char * argv[]) {
	id obj = [MyTestClass myTestClassWithMessage:@"This is First Object!!"];
	[obj printMessage];
	
    return 0;
}
※関連コンテンツ

「初心者のためのObjective-Cプログラミング入門」に戻る