更新:委任者はプロトコルに準拠する必要はありません。プロトコルを使用すると、一部のクラスにメソッドを要求するのが簡単になります。これにより、デリゲートとして設定したオブジェクトが特定のメソッドを実装していることを確認できるため、安全に呼び出すことができます。また、コンパイラは、メソッドが実際に実装されていることを確認できます(デリゲートインスタンス変数をとして宣言するid<SomeProtocol> delegate
と、コンパイラはにdelegate
準拠していないクラスのオブジェクトに設定しようとすると、警告またはエラーが発生しSomeProtocol
ます。
プロトコルは安全性を確保するのに役立ちますが、厳密に必要というわけではありません。クラスにはデリゲート(または複数!)を含めることができ、プロトコルに準拠する必要はまったくありません。
アウトレットに関しては、いいえ、それらは特にそしてInterfaceBuilderでのみ使用されます。IBOutlet
andIBAction
キーワードは、コードに影響を与えません(コンパイル時までに削除されます)。これらは、Interface Builderが検索するマーカーにすぎないため、インターフェイス内でアクセスできるプロパティとメソッドを認識します。「アウトレット」という用語は、としてマークされたものへの直接の参照でIBOutlet
あり、私が知ることができる他のコンテキストでは実際には使用されていません。
繰り返しますが、これをすぐに理解しなくても大丈夫です。少し考えてみると、ある時点で「クリック」するだけです。私は長い間、このように代表者に巻き込まれていましたが、ある日、代表者は本当に特別な存在ではないことに気づきました。これらは他のオブジェクトによって参照される通常のオブジェクトです。このデザインパターンには特別な名前(委任)があり、これらのオブジェクトは委任と呼ばれるだけです。それらは同じように簡単にgyros
またはと呼ぶことができfalafels
、正味の効果は同じです。:Pオブジェクトをデリゲートにするために
、オブジェクトに名前を付ける必要はありません。delegate
それは単なる慣習です。
代表者について:最初に理解すること、そしてこれは私が適切な「Aha!」を手に入れるまでしばらくの間私をつかまえました。瞬間、「委任」について特別なことは何もないということです。「デリゲート」という言葉は、別のクラスが依存するオブジェクトのタイプの単なるタイトルであり、多くの場合、コンテンツや意思決定のために使用されます。開発者は、クラスの1つを名前で別のクラスに結び付けたくない(または結び付けられない)場合にデリゲートを使用します。これは、クラスを分離してより一般的にするオブジェクト指向の方法です。
現在、非常に多くの場合、クラスはデリゲートに依存する特定のメソッドを持たせる必要があり、それを確実にする1つの方法はプロトコル(より一般的にはJavaのインターフェースとして知られています)を使用することです。プロトコルはメソッドのリストを定義します。@interface IFObject : NSObject <SomeProtocol> { ... }
クラスは、インターフェイス(たとえば)で宣言し、必要なすべてのメソッドを実装している場合、プロトコルに「準拠」します。プロトコルにはオプションのメソッドを含めることもできます。
多くのAppKitおよびUIKitクラスは可能な限り汎用的に記述されているため、このモデルは、ビューコントローラー、ビュー、およびGUI全般でよく使用されます。NSTableView
たとえば、実装固有の情報を必要とせずに実装できる最も基本的な動作を実装します。NSTableViewDelegate
残りの部分については、NSTableViewDataSource
プロトコルに準拠する他のオブジェクトに依存します。適切なメソッドを実装している限り、どのオブジェクトもプロトコルに準拠できます(この場合、コントローラークラスは通常、両方のプロトコルのメソッドを実装しますが、そうである必要はありません)。実際、このトピックをよりよく理解する簡単な方法の1つNSTableView
は、delegate
プロパティとdataSource
プロパティがありますが、実際には違いはありません。delegate
と呼ぶことができmonkeyButt
、その概念は引き続き機能します。重要なのは、デリゲートをブラックボックスとして扱わないことです。デリゲートについて特別なことは何もありません。
デリゲートは、GUI以外の目的にも使用できます。おっしゃるように、具体的な例の1つはアプリデリゲートです。NSApplication
デリゲート通知を送信して、アプリケーションが起動されたことを通知します(特に)。これにより、ショップをセットアップできます。繰り返しますが、任意のオブジェクトは、任意の目的で、他のオブジェクトへのデリゲートにすることができます。それは単なる慣習です。
アウトレットについて簡単に説明します。他の人が述べているように、アウトレットは、XIBで定義されたインターフェイスとコードの間の単なる接続です。これらは、Xcodeがインターフェイスを適切な要素にリンクできるようにする方法であり、アプリケーションがインターフェイスファイルをロードするときに、適切なコードをロードしたり、それらを実行したりできます。
これらは通常、インターフェイスを設定するためのより簡単な方法です。厳密に必要というわけではありませんが(XIBファイルを使用せずにプログラムでインターフェイスを作成できます)、XIBルートを使用する場合は、これらを使用します。インターフェイスをコードに関連付けます。