今回は、
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インスタンスしか入れることができません。が、「i
d obj」とすれば、
objにはどんなクラスのインスタンスでも入れることができるわけです。
普通、こうした変数というのは、プログラムのコンパイルをするときに「この変数にはこのクラスのインスタンスが入る」ということをきちんと考えてプログラムが作られるようになっています。つまり、できあがったプログラムでは、指定のタイプの値が設定されて動くようになっているわけですね。こうしたものを「
静的結合」といいます。
これに対し、
id型は、プログラムをコンパイルしてプログラムが作られた段階でも、まだその変数にどういう値が入れられるが決められていないのです。プログラムを実行したとき、その場で「じゃあこれを入れるってことで」と決めることができます。こうしたやり方を「
動的結合」といいます。
動的結合は、非常に柔軟に変数に値を設定することができます。が、プログラムを作るときにはまだどういう値が設定されるかわからないため、その時点で問題のある値が設定されていてもそのままプログラムは作成されてしまいます。つまり、「コンパイル時に設定される内容の正しさがチェックできない」のです。したがって、できたプログラムを実際に動かしている最中に、いきなり強制終了……なんて事態になりかねないこともあります。
このように、
id型はメリットとデメリットがある「諸刃の剣」なのです。まぁ、とても便利で扱いが楽ちんなので、慣れないうちは何でも全部
id型にしてしまう傾向があります。が、プログラムをより厳密に作成するということでいえば、静的結合ですむ場合は
id型は使わないようにしたほうがいいでしょう。両者をうまく使い分けるのが、
id型の使いこなしのコツといえるでしょう。