2

私は自分自身にobjective-cを教えようとしていますが、Python / Javaのバックグラウンドから来ているため、非常に困難であることが証明されています。混乱している点をたくさん投稿しようとしましたが、あいまいすぎるとマークされていたので、セクションに分けて説明します。

まず、私が見つけたデリゲートとアウトレットのすべての例では、ココアビューコードを使用してアイデアを伝えています。残念ながら、例の要点を理解するのに十分なコードをまだ理解していません。それで、誰かが代理人のより基本的な例を提供できますか?私の理解では、それはサブクラス化の方法です。これは従来のサブクラス化よりもどのように優れていますか?すべてのココアプロジェクトにappDelegate.mが自動的に含まれるのはなぜですか?デリゲートは、GUIだけでなく、他の目的にも使用できますか?

わかりました、なるほど。したがって、デリゲートは、他のクラスのプロトコルに準拠するクラスです。プロトコルは、デリゲートクラスに実装する必要がある(またはオプションに設定されている場合は実装できる)メソッドと変数のリストにすぎません。デリゲートを作成するには、@ interfaceキーワードを使用し、次にデリゲートの名前を使用し、次に(<>記号で)プロトコル名を使用する必要がありますか?したがって、クラスc1がそれ自体をクラスcのデリゲートとして設定する場合、クラスcは最初にプロトコルを指定する必要があります。そうすれば、c1のcのプロトコルにすべてを実装できるようになります。@ interface c1; 私はそこにいくつかのビットが欠けているように感じますが、うまくいけば、私は正しい概念を持っています。:)これは、不思議な大なり記号も説明します。それらは、デリゲートが実装するインターフェースを宣言します。

同様に、アウトレットは常にビューコードに関連付けられています。それらはある種のオブジェクト間メッセージングシステムのようです。そうですか?繰り返しになりますが、複雑なGUIステートメントと混同されていない基本的なアウトレットの例は素晴らしいでしょう。それで、アウトレットは決して必要ではありませんか?Interface Builderでの使用を除いて、IBOutletとIBActionは必要ないことは知っていますが、アウトレットはそれよりも一般的だと思いましたか?ドキュメントは、それらが特にインターフェース用ではないことを示しているように見えましたが、何にでも使用できます。

助けてくれてありがとう。

4

5 に答える 5

2

更新:委任者はプロトコルに準拠する必要はありませんプロトコルを使用すると、一部のクラスにメソッドを要求するのが簡単になります。これにより、デリゲートとして設定したオブジェクトが特定のメソッドを実装していることを確認できるため、安全に呼び出すことができます。また、コンパイラは、メソッドが実際に実装されていることを確認できます(デリゲートインスタンス変数をとして宣言するid<SomeProtocol> delegateと、コンパイラはにdelegate準拠していないクラスのオブジェクトに設定しようとすると、警告またはエラーが発生しSomeProtocolます。

プロトコルは安全性を確保するのに役立ちますが、厳密に必要というわけではありません。クラスにはデリゲート(または複数!)を含めることができ、プロトコルに準拠する必要はまったくありません。

アウトレットに関しては、いいえ、それらは特にそしてInterfaceBuilderでのみ使用されます。IBOutletandIBActionキーワードは、コードに影響を与えません(コンパイル時までに削除されます)。これらは、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ルートを使用する場合は、これらを使用します。インターフェイスをコードに関連付けます。

于 2013-01-22T16:51:13.707 に答える
1

デリゲートは、それ自体がデリゲートとして宣言されているオブジェクトによって何らかのタスクを委任されるオブジェクトです。オブジェクトが何らかのタスクを実行し、いわばそれを「所有」しているオブジェクトに通知する必要があるとします。オブジェクトがどのような条件下でも動作できるようにするために、どのタイプのオブジェクトに接続する必要があるかを知ることはできません。そのため、デリゲートを設定し、そのプロトコルに従います。オブジェクトのデリゲートを設定することは、「これが、プロトコルで宣言されたメッセージとの接続に使用するオブジェクトです。オブジェクトが実際にプロトコルのメソッドを実装することを約束します。」と言っているようなものです。たとえば、これを見ることができます。

@protocol SpriteDelegateProtocol
    @required
    - (void) projectionMatrix;
    @optional
    - (void) animation:(int)animationIndex willCompleteFrameNumber:(int)frame forSprite:(id)sender;
@end

@interface Sprite
@property (nonatomic, assign) id<SpriteDelegateProtocol> delegate;
@end

スプライト オブジェクトのインターフェイスは、タイプが であるデリゲートと呼ばれるプロパティを持つことを宣言しますid。任意のオブジェクトを指定できますが、三角括弧内のプロトコルに準拠する必要があります。プロトコルに準拠している場合 @required で宣言されたメソッドを実装する必要があり、@optional でリストされているメソッドを実装できます。デリゲートが のようなものを使用してオプションのメソッドを実際に実装するかどうかを判断するのは、私たち次第ですrespondsToSelector:。戻り値を格納するメソッドが多数ある場合は、戻り値を格納することもできます。

アプリケーション デリゲートは、UIApplication オブジェクトへのデリゲートであるという点で特別です。などのアプリケーションの状態に関するメッセージを受け取りますapplicationDidEnterBackground:ここで、アプリケーション デリゲートが準拠しているプロトコルのメソッドを確認できます。

デリゲートは、任意のオブジェクトで使用できます。どのオブジェクトも、設定するデリゲート プロパティがあり、上記のように次のメソッドが必要であると言うことができます。プロトコルは本質的に移植可能なインターフェイスであり、別のオブジェクトに実装する必要があるものを伝えるために使用できるため、そのメソッドを呼び出して機能の一部を委任することができます。タスクが完了したときにデリゲートに通知したり、情報を提供するよう依頼したり (必要に応じて別のオブジェクトにすることができるように、通常はデリゲートではなくデータ ソースと呼ばれます)、何らかのタスクを実行する必要があるかどうかを依頼したりできます。全て。

アウトレットは、NIB またはストーリーボードでインスタンス化されたビューをそのコントローラーのプロパティに接続する方法です。したがって、UIViewController をメインのストーリーボードに配置し、そのクラスを MyGreatControllerSubclass に変更してから、そのコントローラーのビューにボタンを配置する場合、そのボタンをコントローラーのインターフェイスの「アウトレット」(プロパティ) に接続して、後でコントローラーからボタンにアクセスできます。

于 2013-01-22T16:53:17.180 に答える
0

デリゲートはサブクラス化の方法ではありません。私も Java 出身で、OC を 5 年近くやっています。

デリゲートは通常、インターフェイスに相当するプロトコルに準拠します。これの優れている点は、デリゲートによってカバーされるものをどのように実装するかについて、多くの柔軟性が得られることです。たとえば、UITableViewController を拡張するかデリゲートを実装することで、テーブル ビューを実装できることがわかります。そうすれば、ユーザーがあるテーブルからアイテムを選択して別のテーブルに配置する合成ビューがある場合、単一のコントローラーを実行して、両方のビューの委任を実行させることができます。

デリゲートについて考える最良の方法は、メッセージ/イベント指向のコールバックの例です。フレームワークが通常のプログラミングと異なるのは、フレームワークを使用すると、求める結果を確実にするために何をする必要があるかを示すということわざを聞いたことがありますか? それが委任です。昨夜、コレクション ビューを実行していましたが、編集メニューが表示されませんでした。3 つのメソッドの委任を提供するだけで、メニューがどのように呼び出されるか、長押しジェスチャ ハンドラーがどこにあるかなどについては何もわかりません。

デリゲートは、OC の世界で依存性注入を不要にする接着剤であることに注意してください。私はそれらを好みます。

于 2013-01-22T16:37:45.147 に答える
0

デリゲートは一般的な設計パターン (http://en.wikipedia.org/wiki/Delegation_pattern) であり、objective-c 固有のものではありません。

アウトレットは、コントローラーとビュー (GUI) のバインディングを行う可能性があります。MVC パラダイム (model-view-controller) をご存知でしょうか? したがって、Interface Builder を使用して GUI (MVC からのビュー) を構築し、アウトレットを使用して、ボタン、テキスト フィールドなどのこの GUI の要素を Obj-C コード (MVC からのコントローラー) にバインドします。

于 2013-01-22T16:48:45.150 に答える
0

この投稿をご覧ください: C# コードでの Objective-C のプロトコルの準拠

タイトルの「C#」という単語は気にしないでください。その部分は無視してかまいません。この投稿の主要部分では、Objective-C についてprotocols説明しdelegatesます。これは役立つかもしれません。

于 2013-01-31T03:32:36.383 に答える