

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

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

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


CC BY-SA 3.0
2015-01-20T14:42:11.227
4930
2015-01-23T04:51:52.490
2015-01-22T04:39:46.640
30
7603
question
ios objective-c delegate
Objective-C の Delegateとは？


[Objective-Cプログラミングの概念 Apple
日本語版](https://developer.apple.com/jp/documentation/CocoaEncyclopedia.pdf)
のページ22からを、まずは読んでみれば、どうでしょうか。


CC BY-SA 3.0
2015-01-21T00:55:55.753
4939
2015-01-21T00:55:55.753
75
4930
answer


kmugitaniさんがおっしゃられているように、まずは公式のドキュメントを読んでみると良いと思います（ページ数もそんなにないですし）。  
読んでみてなんとなく分かったら、自分でDelegateを持ったクラスを作成するとより理解が深まると思います。

だいぶ端折っていますが、Objective-Cならこんな感じです。  
**MyView.h**

[code]

    @protocol MyViewDelegate <NSObject>
    // プロセス完了時に実行される
    -(void)processCompletion
    @end
    
[/code]

**MyView.m**

[code]

    -(void)completion
    {
        // MyViewで必要な処理を実行する
    
        // デリゲートメソッドを呼ぶ
        [_delegate processCompletion];
    }
    
[/code]

あと、これは参考になるか分かりませんが、少しだけ他の言語を触ってみると気づきがあるかもしれません。  
自分の場合はAndroidのEventListenerを触った時に少し分かった気がしました。


CC BY-SA 3.0
2015-01-21T01:29:18.873
4941
2015-01-21T01:29:18.873
3516
4930
answer


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ページ:

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


CC BY-SA 3.0
2015-01-21T02:54:37.310
4942
2015-01-21T02:54:37.310
49
4930
answer


オブジェクト指向及び delegate については以下の資料の  
「最強オブジェクト指向言語 JavaScript 再入門！」  
<http://www.slideshare.net/yuka2py/javascript-23768378>  
下記のスライドのあたりが個人的にはいちばん参考になりました。  
![new](https://i.stack.imgur.com/agMTi.jpg)  
![delegate](https://i.stack.imgur.com/Z2Koq.jpg)


CC BY-SA 3.0
2015-01-22T05:06:53.640
5047
2015-01-22T05:27:59.367
2020-06-17T08:14:45.997
-1
2108
4930
answer