2012-03-06 12 views
32

私はオプションのメソッドでプロトコルを実装しましたが、メッセージを送信する前にrespondsToSelector:self.delegateに送信したいが、それはコンパイルされません。失敗メッセージは次のとおりです。self.delegate respondsToSelector:...コンパイルされません

セレクタ 'respondsToSelector'の既知のインスタンスメソッドはです。回避策として

以下に示すように、私は...

//MyClass.h: 

@class MyClass; 

@Protocol MyClassDelegate 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

@interface MyClass : UIViewController 

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

@end 

//MyClass.m: 

... 
@synthesize delegate = _delegate; 
... 

id sanitizedDelegate = self.delegate; //Hmmmm... why does this work? 

if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) { 
    [self.delegate myClass:self willDoSomething:animated]; 
} 

をコンパイルした、デリゲートを "サニタイズ"。

this oneを含む多数の投稿を確認しましたが、コンパイル失敗の問題には答えません。

また、代替アクセサは動作しません...

[self delegate] 
//or 
_delegate 

は、誰もがこれを見ているか、ハンドリングのより良い方法を助言することができますか?

IOS 5.0:(9A334)、Xcodeの4.2.1(4D502)

答えて

95

-respondsToSelector:は、NSObjectのメソッドです。あなたのidデリゲートが実際にNSObjectのであると仮定し、それをキャストし、次のいずれか

[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]

または、より良い、デリゲートを明示的にNSObjectの作成:

@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;

またはプロトコルを可能にしますNSObjectのサブプロトコル:

@protocol MyClassDelegate <NSObject>

+10

Ka-ching ...私はドア#3を持っていきます。 – vmanjz

+0

代理人をNSObjectとして宣言しました。ありがとうございました! – c0d3Junk13

14

基本的には、コンパイラがそれらを利用できる唯一の方法であると仮定しているので、あなたのデリゲートは、あなただけの<MyClassDelegate>プロトコルによって制約されていることを言っています。

@Protocol MyClassDelegate <NSObject> 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

コンパイラはあなたのプロトコルに準拠する任意のオブジェクトにもrespondsToSelector:を定義<NSObject>プロトコルに準拠していることを知っていること方法:何をする必要があるプロトコルがそうのよう<NSObject>を拡張しています。

+1

ええ、コード補完は今から同じ...標準的な練習を勧めます。 – vmanjz

関連する問題