self.delegate respondsToSelector:...不编译 [英] self.delegate respondsToSelector: ... does not compile
问题描述
我已经使用可选方法实现了一个协议,在调用方法中我想将 respondsToSelector:
发送到 self.delegate
在我发送消息之前,但是没有编译。失败消息是:
I've implemented a protocol with an optional method and in the calling method I want to send respondsToSelector:
to self.delegate
before I send the message, but that does not compile. The fail message is:
否选择器'respondsToSelector'的已知实例方法。
作为解决方法,我清理了如下所示的代理,它编译了......
As a work-around, I "sanitized" the delegate as shown below, which compiles...
//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];
}
。
我检查了一些帖子,包括这个,但它没有回答编译失败问题。
I checked a number of posts including this one but it does not answer the compilation fail issue.
此外,替代访问者不起作用...
Also, alternative accessors do not work...
[self delegate]
//or
_delegate
有没有人看过这个或者可以建议更好的处理方式?
Has anyone seen this or can advise a better way of handling?
IOS 5.0:(9A334),Xcode 4.2.1(4D502)
IOS 5.0:(9A334), Xcode 4.2.1 (4D502)
推荐答案
-respondsToSelector:
是NSObject上的一个方法。假设您的 id
委托实际上是一个NSObject,并将其强制转换:
-respondsToSelector:
is a method on NSObject. Either assume that your id
delegate is in fact an NSObject, and cast it:
[(NSObject *)self.delegate respondsToSelector:@ selector(myClass:willDoSomething :))
或者,更好的是,明确地让你的委托NSObject:
Or, better, make your delegate explicitly an NSObject:
@property(非原子,弱)NSObject< MyClassDelegate> *委托;
或者使协议成为NSObject的子协议:
Or make the protocol be a sub-protocol of NSObject:
@protocol MyClassDelegate< NSObject>
这篇关于self.delegate respondsToSelector:...不编译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!