2

呼び出しクラスをデリゲートとして NSURLConnection を作成しました。オブジェクトがプロトコルを監視していると宣言したことがないことに気付く前に、これをテストデバイスに組み込みましたが、実行されました(通常はそう言えますが、複数のスレッドでアプリを完全に台無しにしたと思います)。

では、デリゲートを実装するオブジェクトを宣言する必要はないのでしょうか?

また、必要なすべてのデリゲート メソッドを含めていませんでしたが、それでもデリゲート メソッドを呼び出していました。

このプロジェクトには他の人がいて、かなり大きいので、デリゲート プロトコルがどこかで不明瞭に宣言されている可能性がありますが、ヘッダーと実装の宣言でそれを検索している間、私はそれを見ませんでした。

4

3 に答える 3

4

メソッドのdelegateパラメータは のNSURLConnection initWithRequest:delegate:型で定義されていid<NSURLConnectionDelegate>ます。

に準拠していると宣言していないオブジェクトをNSURLConnectionDelegate渡すと、間違った種類のオブジェクトを渡していることを示すコンパイラ警告が表示されます。なんらかの警告が表示されるかどうかを再確認してください。そうでない場合は、クラスがプロトコルに準拠していることを適切に宣言します。

実行時の唯一の要件は、デリゲート オブジェクトが少なくともデリゲートの必要なメソッドを実際に実装することです。ただし、この場合、プロトコルに必要なメソッドはありません。それらはすべてオプションです。

あなたは次のように述べています。これは意味がありません。それらを実装しない場合、どのように呼び出すことができますか? さらに、プロトコルには必須のメソッドはありません。

于 2013-05-23T22:39:44.663 に答える
1

実装方法次第だと思いますNSURLConnection。まず、setDelegate:メソッド/プロパティが type のオブジェクトを受け入れるように設定されている場合id<NSURLConnectionDelegate>、コンパイラは警告を表示する必要があります。NSURLConnectionソース コードが (たとえば) プロトコル メソッドを呼び出す前にデリゲートをチェックする場合、+conformsToProtocol:オブジェクトはコールバックされるべきではありません。

編集: rmaddy は、プロトコルのすべてのメソッドがオプションであることを追加します。その場合、NSURLConnectionおそらく-respondsToSelector:(class) ではなく(instance) でチェックします+conformsToProtocol:。その場合、メソッドを実装するだけで十分です (ただし、それでも警告が表示されるはずです-setDelegate:) 。

于 2013-05-23T22:39:18.630 に答える
1

ドキュメンテーションの内容にかかわらず、Cocoa の および の実際の定義を見るinitWithRequestconnectionWithRequest、次のように定義されています。

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest *)request delegate:(id)delegate;

ご覧のとおり、delegateパラメーターはid明示的で正式なプロトコルが指定されていないものとして定義されているため、渡したオブジェクトが特定のプロトコルに準拠していると定義されていなくても、警告は表示されません。 .

したがって、あなたの質問への回答として、この特定のケースでは、特定のプロトコルに準拠するようにデリゲートを定義する必要はありません。他の多くの場合、delegateプロパティは適切なプロトコルに準拠するポインターを取るように定義されているため、オブジェクトが準拠していない場合、コンパイラーは警告を発します。しかし、この場合ではありません。

言うまでもなく、準拠しているプロトコルを定義する必要があります。これにより、コーディングがより明確になり、少なくとも、これらのいずれかを書き始めるときに Xcode でより優れたオートコンプリートを楽しむことができます。メソッド。しかし、あなたの質問は、すべきかどうか(すべきか) ではなく、すべきか (すべきでないか) でした。

明確にするために、iOS には 2 つのNSURLConnectionプロトコルがNSURLConnectionDataDelegateあり、NSURLConnectionDelegate. (これが、一部のメソッドをこのプロトコルに移行することとの混乱を避けるために、メソッド宣言でプロトコルを定義しない理由である可能性がありNSURLConnectionDataDelegateます。)

于 2013-05-24T04:26:28.060 に答える