「
デリゲート」というのは、「あるものの処理を、代理で行うもの」です。例えば、あるクラスがあり、そこにさまざまなメソッドが用意されているとしましょう。このとき、その用意されているメソッドの内容を変更したりするにはどうすればいいでしょうか。
そのクラスを継承して行う、というのも一つの形ですが、もうひとつのアプローチとしてObjective-Cで多用されるのが「
デリゲート」なのです。あらかじめ、そのクラスで使うメソッドを実装した別クラスを用意しておき、これを「
デリゲート」としてそのクラスに設定をしてやるのです。すると、そのクラスの所定メソッドを呼び出す必要があると、設定されたデリゲートクラスにあるメソッドが「代理」で呼び出され、実行されるようになるのですね。
ここでは、
UIApplicationDelegateというデリゲートのためのプロトコルが使われています。これは、「
UIApplication」というクラスの機能を代理で処理するためのものなのです。この
UIApplicationは、要するに「アプリケーションの基本部分を管理するクラス」と考えてください。この
UIApplicationのデリゲートクラスとして
MyIAppAppDelegateクラスを用意することで、アプリケーションの何か処理を呼び出す必要が生ずると、この
MyIAppAppDelegateにあるメソッドが呼び出されるようになります。つまり、MyIAppAppDelegateを定義することで、アプリケーションの重要な処理をプログラマが自分で定義できるようになる、というわけなのです。
■プロパティとIBOutlet
さて、
MyIAppAppDelegateに用意されているインスタンス変数と、それを利用するプロパティについても見てみましょう。ここでは、以下の2つのインスタンス変数がありますね。
UIWindow *window;
MyIAppViewController *viewController;
UIWindowは、ウインドウのクラスです。アプリケーションのメインウインドウとなるインスタンスがここに保管されると考えていいでしょう。
もう1つの
MyIAppViewControllerは、「
ビューコントローラー」というものです。これは、次に定義をするクラスで、このクラスにウインドウ内の様々なGUIに関する処理が用意されていくことになります。
これらは、
プロパティとして利用出来るようになっています。プロパティというのは、「インスタンス内に保管されている値を外部からうまく利用出来るようにするための仕組み」です。インスタンス変数は、外部から利用出来るようにしようとすると、その値を読み書きするためのメソッドを用意したりと大変です。そうした手間をかけず、簡単に外部アクセスを可能にするために、
プロパティが導入されています。
その後にある、
@propertyという文が、そのためのものです。プロパティは、こんな具合にして記述をします。
@property ( 属性 ) タイプ 名前;
まぁ、このプロパティというのも、きっちり理解しようとするといろいろ覚えないといけないことがたくさんあるのですが、要するに「こうやって、外部から名前を指定するだけでインスタンス変数が使えるようになるんだ」ということだけわかっていればいいでしょう。
ここでは、2つのインスタンス変数がプロパティとして用意されていますが、これらのプロパティには「
IBOutlet」というものがつけられていますね。この
IBOutletは、忘れないでください。これは、「
Interface Builderで作成したレイアウトの部品とプロパティを結びつけるための特別なマクロ」なのです。
後でいずれ出てきますが、iOSやMac OS Xでは、画面の表示は「
Interface Builder」という専用ツールを使ってデザインをします。そして、ここでレイアウトしたGUIの部品が、プログラムを実行する際にそのまま画面に表示され使われるのですね。これらのGUI部品を操作したりしたときにプログラムが実行されるようにするためには、作成したGUI部品と、プログラムのソースコードがうまく結び付けられていないといけません。
そのために記述されているのが、
IBOutletです。これにより、このプロパティは、Interface Builder側で特定のGUI部品と関連付けることができるようになるのです。――まぁ、要するに「Interface Builderで利用できるようにするための目印」みたいなもの、と考えるとよいでしょう。