- (void)someMethod
{
if ( [delegate respondsToSelector:@selector(operationShouldProceed)] )
{
if ( [delegate operationShouldProceed] )
{
// do something appropriate
}
}
}
只有在正式协议中的可选方法或非正式协议的方法中,才需要采取预防措施
什么意思?如果我使用正式的协议,我可以只使用[delegate myMethod]
发布于 2010-09-13 07:29:40
你可以在你认为需要的时候使用它:检查一个对象是否实现了你要调用的方法。通常,当您有可选的方法或非正式协议时,就会这样做。
我只在编写必须与委托对象通信的代码时使用过respondsToSelector
。
if ([self.delegate respondsToSelector:@selector(engineDidStartRunning:)]) {
[self.delegate engineDidStartRunning:self];
}
有时,您可能希望在任何返回的方法上使用respondsToSelector
,在不确定返回对象的类是什么的情况下使用id
或泛型NSObject
。
发布于 2010-09-13 07:33:16
除了@kubi所说的,我使用它的另一次是在新版本的框架中将一个方法添加到预先存在的类中,但我仍然需要向后兼容。例如:
if ([myObject respondsToSelector:@selector(doAwesomeNewThing)]) {
[myObject doAwesomeNewThing];
} else {
[self doOldWorkaroundHackWithObject:myObject];
}
发布于 2014-02-03 17:12:09
正如kubi提到的,当你有一个符合协议的方法实例时,通常使用respondsToSelector
。
// Extend from the NSObject protocol so it is safe to call `respondsToSelector`
@protocol MyProtocol <NSObject>
// @required by default
- (void) requiredMethod;
@optional
- (void)optionalMethod;
@end
给定该协议的实例,我们可以安全地调用任何所需的方法。
id <MyProtocol> myObject = ...
[myObject requiredMethod];
但是,可选方法可能会实现,也可能不会实现,因此需要在运行时进行检查。
if ([myObject respondsToSelector:@selector(optionalMethod)])
{
[myObject optionalMethod];
}
这样做可以防止无法识别的选择器崩溃。
此外,您应该将协议声明为NSObjects的扩展的原因。
@protocol MyProtocol <NSObject>
是因为NSObject协议声明了respondsToSelector:
选择器。否则XCode会认为调用它是不安全的。
https://stackoverflow.com/questions/3697058
复制相似问题