Objective-C の Delegateとは？


今までなんとなく Objective-C の Delegate を使っていましたが、もっと理解を深めたいと考えています。 現在は「UITableView
を使いたいから Delegate しないと」程度の認識です。

  * Delegate の正確な意味合い
  * 設計上の位置付け

はどういったものなのでしょうか。




Objective-Cの「デリゲート(delegate)」は、プログラミング言語Objective-
Cが提供する特定機能をさすのではなく、アプリケーション実装における[デザインパターン](http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_%28%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29)の一種です。（一例として、Objective-
Cとは異なり、C#ではdelegateという言語"機能"が存在します。）

Objective-
Cのデリゲートは単なるパターン（≒設計上の決まり事）ですから、ソフトウェア設計者間で共通認識を持つためにも、コーディングを行う上では一定のルール付けが必要とされます。以下、Apple公式ドキュメント「[Objective-
Cプログラミングの概念](https://developer.apple.com/jp/documentation/CocoaEncyclopedia.pdf)」からの抜粋です。（読みやすさのため本質でない部分は削りました）

22ページ:

> デリゲート(delegate,
> 委譲)とは、あるオブジェクトがプログラム中でイベントに遭遇したとき、それに代わって、または連携して処理するオブジェクトのことです。  
>  [...]  
>  デリゲートの仕組み  
>
> デリゲートの設計は単純です。委譲する側のクラス（デリゲートクラス）には、一般にdelegateという名前の、アウトレットまたはプロパティがあります。[...]

24ページ:

> デリゲートメッセージの形式  
>  デリゲートメソッドの名前のつけ方には規約があります。[...]

28ページ:

> カスタムクラスにデリゲートを実装する手順は次の通りです。  
>  * クラスのヘッダファイルに、デリゲートのアクセサメソッドを宣言する。[...]  
>  * アクセサメソッドを実装する。[...]  
>  * デリゲートに対するプロトコルを宣言する。[...]

