4

親クラスに何かを伝えたいときはいつでも、親の関数を直接呼び出す代わりにデリゲートを使用しました。私はこのように実装しました...

例えば:

    CustomClass *custom = [[CustomClass alloc] init];
    // assign delegate
    custom.delegate = self; // Here we are giving parent instance like normal method call.
    [custom helloDelegate];

カスタムクラスでは、以下のように親を親密にしています....

-(void)helloDelegate
{
    // send message the message to the delegate
    [_delegate sayHello:self];
}

だから私の疑問、それは直接呼び出しとどう違うのですか?. self でデリゲート変数を設定することは、親インスタンスを子に与え、必要に応じて子に関数を呼び出させることと同じです。ここでプロトコルがどのように役立つか、またはなぜプロトコルが必要なのですか? 利点は何ですか?

ありがとう

4

3 に答える 3

2

直接リレーションを使用するのではなく、デリゲートを使用する利点の実例。

ユニバーサル アプリを作成しているとします。iPadViewControllerコードに2 つのビュー コントローラーがiPhoneViewControllerあり、どちらも Web サービスからデータを取得する必要があります。したがって、Web サービス呼び出し用のクラスを作成しますwebServiceDownloaderClass

webServiceDownloaderClassここで、両方のビュー コントローラーに、が終了したときに通知する必要があります。

ここでのオプション...

オプション 1 強い結合

あなたの中iPadViewControllerでメソッドを定義します- (void)webServiceDidGetArray:(NSArray *)array;。そしてiPhoneViewController、同じメソッドを定義します。

がこれらのwebServiceDownloaderClassメソッドを呼び出すには、各コントローラーへの参照が必要です...

@property (nonatomic, strong) IPadViewController *iPadController;
@property (nonatomic, strong) IPhoneViewController *iPhoneController;

そして、それが終了したら、どちらを呼び出すかを決定する必要があります...

if (iPadController) {
    [iPadController webServiceDidGetArray];
}

etc....

ここでの短所は、View Controller が Web サービス クラスが終了したときに何をするかを定義するようなものであることです。また、別のコントローラーを追加すると、別のプロパティがあり、参照したコントローラーが実際に呼び出しようとしているメソッドを持っているという実際の保証はありません。

オプション 2 委任

we サービス クラスで、プロトコルを定義します。

@protocol WebServiceDownloaderDelegate <NSObject>

- (void)webServiceDidGetArray:(NSArray *)array

@end

そして代議員…

@property (nonatomic, weak) id <WebServiceDownloaderDelegate> delegate;

ここで、Web サービス クラスで Web サービス クラスのアクションを定義しています。また、デリゲートになりたいクラスへの参照が 1 つだけ必要です。また、どのクラスもデリゲートになることができます。これで、iPad と iPhone の両方のコントローラーがデリゲートになり、プロトコルに準拠することで、必要なメソッドを実装することを Web サービス クラスに "約束" することができます- (void)webServiceDidGetArray:(NSArray *)array;

もちろん、これはデリゲートが役立つ 1 つのケースにすぎません。

委任ではなく直接的な関係を使用する必要がある場合もあります。

于 2013-08-21T12:30:56.223 に答える
0

デリゲート呼び出し通常のメソッド呼び出しと変わりません!

異なるのは使用方法であり、これは呼び出しメカニズムとは関係ありません。デリゲートは、デリゲート サービスを「消費する」コードからデリゲート サービスを提供するコードの定義を分離するために使用されます。その特定のデリゲート プロバイダーについて知るようにコーディングする必要があります。

Objective C では、デリゲートは一般に「プロトコル」を使用して実装されますが、プロトコルの使用はこれだけではありません。Objective C は、さまざまな Cocoa クラス間で共通のインターフェイスを提供するために、それらを広範囲に使用します。

また、限られた状況では、プロトコルではなく共通のスーパークラスを使用してデリゲートを合法的に実装できます。

同じ開発作業の一部であり、互いに離れて使用される可能性が低い 2 つのクラスがある場合、デリゲート「パターン」を使用してそれらの間の通信を容易にする必要はありません。サービス消費者/サービス提供者の関係。そうする唯一の理由は、「サービス」が別のプロジェクトで変更されずに再利用された場合に備えて、「仕様上」です。

于 2013-08-21T12:27:34.483 に答える