デリゲート(Delegation)
デリゲートは、プログラム内のあるオブジェクトが代わりに動作するか、または別のオブジェクトと連携して働くシンプルかつ強力なパターンです。デリゲートオブジェクトは他のオブジェクト(デリゲート)と適切な時間にそれにメッセージを送信する時に、参照を保持します。メッセージは、デリゲートオブジェクトが処理しようとしているか、処理したイベントのデリゲートに通知します。デリゲートは、それ自体、またはアプリ内の他のオブジェクトの外観や状態を更新することによって、メッセージに応答することができ、場合によっては切迫したイベントが処理される方法に影響を与える値を返せます。デリゲートの主な価値は、それが簡単に1つの中央オブジェクト内の複数のオブジェクトの動作を簡単にカスタマイズすることを可能にすることです。
デリゲートとココアフレームワーク
デリゲートオブジェクトは、通常、フレームワーク·オブジェクトであり、デリゲートは、通常、カスタムコントローラオブジェクトです。メモリ管理環境では、デリゲートオブジェクトは、そのデリゲートへの弱い参照を維持します。ガベージコレクション環境では、受信者は、そのデリゲートへの強い参照を保持します。Foundation のデリゲートの例としては、UIKit、AppKit、その他ココアとココアタッチのフレームワークに豊富に例があります。
デリゲートオブジェクトの例としては、AppKit フレームワークの NSWindow クラスのインスタンスです。NSWindow は、そのメソッドの中に windowShouldClose: があり、プロトコルを宣言しています。ユーザーがウィンドウのクローズボックスをクリックすると、ウィンドウオブジェクトは windowShouldClose: を、そのデリゲートにウィンドウを閉じていいか確認するために、それを送信します。デリゲートは、それによって、ウィンドウオブジェクトの動作を制御するブール値を返します。
デリゲートと通知
ほとんどの Cocoa フレームワーククラスのデリゲートは自動的にデリゲートオブジェクトによって通知を投稿されるオブザーバとして登録されます。デリゲートは、特定の通知メッセージを受信するためのフレームワーククラスによって宣言された通知メソッドを実装する必要が少なくともあります。上記の例に従うと、ウインドウオブジェクトは NSWindowWillCloseNotification を観察のため送りますが、そのデリゲートへ windowShouldClose: メッセージを送ります。
データソース
データソースは、デリゲートとほぼ同じです。違いは、デリゲートオブジェクトとの関係にあります。ユーザー·インタフェースの制御をデリゲートされる代わりに、データソースは、データの制御を委任(デリゲート)されます。デリゲートオブジェクトは、一般に、テーブルビューなどのビュー·オブジェクトですが、そのデータソースへの参照を保持し、時折それが表示されるはずのデータのためにそれを要求します。データソースは、デリゲートのようにプロトコルを採用しなければならず、最低でもそのプロトコルの必要なメソッドを実装します。データソースは、それらがデリゲートビューに与えるモデルオブジェクトのメモリを管理する責任があります。
前提条件の記事
関連記事
既出の議論
デリゲートとデータソース
サンプルコードプロジェクト
iOS 用の TableView の基礎
次の章
前の章