self.delegate respondsToSelector:...不编译

vma*_*njz 33 xcode ios5

我已经实现了一个协议,一个可选的方法和调用方法我想发respondsToSelector:self.delegate之前,我发送消息,但是,这并不编译.失败消息是:

没有已知的选择器'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
Run Code Online (Sandbox Code Playgroud)

//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];
}
Run Code Online (Sandbox Code Playgroud)

.

我检查了一些帖子,包括这个,但它没有回答编译失败问题.

此外,替代访问器不起作用......

[self delegate]
//or
_delegate
Run Code Online (Sandbox Code Playgroud)

有没有人看过这个或者可以建议更好的处理方式?

IOS 5.0:(9A334),Xcode 4.2.1(4D502)

Kur*_*vis 101

-respondsToSelector:是NSObject上的一个方法.假设您的id委托实际上是一个NSObject,并将其强制转换:

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

或者,更好的是,使您的委托显式为NSObject:

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

或者使协议成为NSObject的子协议:

@protocol MyClassDelegate <NSObject>

  • 嘉庆......我会带上#3门. (10认同)

NJo*_*nes 15

基本上你是说你的委托只受你的<MyClassDelegate>协议约束,所以编译器假定那些是唯一可用的方法.您需要做的是让协议扩展<NSObject>如下:

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

这样编译器就知道任何符合您协议的对象也符合<NSObject>定义的协议respondsToSelector:.