2009-09-30 8 views
5

これは私が間違ったデザインパターンをしている可能性があります。Xcodeをドロップすると、委任時に "No XXX method found"という警告が表示される

NSURLConnectionを使用するアプリケーションで非同期委任を実装しています。オブジェクトはNSURLConnectionをラップし、委任されたメッセージを処理します。それはうまく動作します。

NO ':今、私はそれ(NSURLConnectionメッセージConnectionWrapperConnectionWrapperメッセージNeedsToUseConnection、あなたがアイデアを得る)を使用するオブジェクトに私自身の代表団を定義していて、それは同様に動作しますが、しかし、Xcodeはこの警告を発していません-request:

id<NSObject> delegate; 

...とXcodeがCHEです:finishedWithResult」メソッドは、私がこのように呼んでいるデリゲートを宣言していますので、これは、おそらく、ある

を見つけましたどのようなNSObjectがFoundationフレームワークで宣言しているのか分かりません。私のカスタムデリゲートメッセージはありません。別に警告をオフから

if([delegate respondsToSelector:@selector(request:finishedWithResult:)]) 
    [delegate request:self finishedWithResult:ret]; 

- 私は、できるだけ多くの警告にして仕事をしたい - 通信する方法があります(いずれかの構文的またはコンパイラ・ディレクティブを経由して):私はきちんとコールを絶縁しています私はこのメッセージが宣言されていないことを知っていますか?代わりに、私はこのJava用のインタフェース設計パターンを使用するべきですか? id<WillReceiveRequestMessages>などを使用していますか?

提案があります。それをやっての

答えて

10

良い方法は、あなた自身のデリゲートプロトコルを作成するには、次のようになります。

id <MyControlDelegate> delegate; 

コンパイラもはや時に文句を言うだろう:

@protocol MyControlDelegate <NSObject> 

@optional 
- (void)request:(MyControl *)request didFinishWithResult:(id)result; 

@end 

その後、あなたはこのようなあなたの代理人が宣言しないだろうあなたはこれを書いています:

if ([delegate respondsToSelector:@selector(request:didFinishWithResult:)]) 
    [delegate request:self didFinishWithResult:result]; 

<NSObject>の構文は次のとおりですこれはコンパイラにNSObjectプロトコルを組み込むように指示するためです。これはあなたのプロトコルがrespondsToSelector:のようなメソッドを得る方法です。あなたがそれを残しておけば、コンパイラはrespondsToSelector:の代わりに文句を言うでしょう。

+1

ありがとうございます。私はUIAlertViewDelegateでその事例を見てきました。これはとても役に立ちます。 –

0

私は私はこのような を呼んでいるデリゲートを宣言していますので、これは、おそらく、次のとおりです。...とXcodeはNSObjectのは Foundationフレームワークに宣言し何をチェックしています。

これは間違っています。そうであれば、そのメソッドについての「応答しないかもしれません」というオブジェクトに関する警告が表示されます。これは全く別の問題です。

この警告は、コンパイラがセレクタを呼び出すためにセレクタのシグニチャを認識している必要があるためです。これは、舞台裏では、メソッドがstruct型を返すかどうかによって、メソッド呼び出しをobjc_msgSendまたはobjc_msgSend_stretに変換するためです。戻り値の型がわからない場合は、structではないと推測し、最初の関数を使用します。しかし、これは間違っている可能性があります。

この解決方法は、と宣言された方法をすべてにすることです。正しいクラスで宣言される必要はありません。使用されていないダミープロトコルで宣言できます。 どこかにと宣言されている限り、コンパイラはこれを認識して正しくコンパイルできます。

関連する問題