首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时在objective-c中使用respondsToSelector

何时在objective-c中使用respondsToSelector
EN

Stack Overflow用户
提问于 2010-09-13 07:17:31
回答 4查看 92.5K关注 0票数 67
代码语言:javascript
复制
- (void)someMethod
{
    if ( [delegate respondsToSelector:@selector(operationShouldProceed)] )
    {
        if ( [delegate operationShouldProceed] )
        {
            // do something appropriate
        }
    }
}

documentation说:

只有在正式协议中的可选方法或非正式协议的方法中,才需要采取预防措施

什么意思?如果我使用正式的协议,我可以只使用[delegate myMethod]

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-13 07:29:40

你可以在你认为需要的时候使用它:检查一个对象是否实现了你要调用的方法。通常,当您有可选的方法或非正式协议时,就会这样做。

我只在编写必须与委托对象通信的代码时使用过respondsToSelector

代码语言:javascript
复制
if ([self.delegate respondsToSelector:@selector(engineDidStartRunning:)]) {
        [self.delegate engineDidStartRunning:self];
    }

有时,您可能希望在任何返回的方法上使用respondsToSelector,在不确定返回对象的类是什么的情况下使用id或泛型NSObject

票数 86
EN

Stack Overflow用户

发布于 2010-09-13 07:33:16

除了@kubi所说的,我使用它的另一次是在新版本的框架中将一个方法添加到预先存在的类中,但我仍然需要向后兼容。例如:

代码语言:javascript
复制
if ([myObject respondsToSelector:@selector(doAwesomeNewThing)]) {
  [myObject doAwesomeNewThing];
} else {
  [self doOldWorkaroundHackWithObject:myObject];
}
票数 47
EN

Stack Overflow用户

发布于 2014-02-03 17:12:09

正如kubi提到的,当你有一个符合协议的方法实例时,通常使用respondsToSelector

代码语言:javascript
复制
// Extend from the NSObject protocol so it is safe to call `respondsToSelector` 
@protocol MyProtocol <NSObject> 

// @required by default
- (void) requiredMethod;

@optional

- (void)optionalMethod;

@end

给定该协议的实例,我们可以安全地调用任何所需的方法。

代码语言:javascript
复制
id <MyProtocol> myObject = ... 
[myObject requiredMethod];

但是,可选方法可能会实现,也可能不会实现,因此需要在运行时进行检查。

代码语言:javascript
复制
if ([myObject respondsToSelector:@selector(optionalMethod)]) 
{
     [myObject optionalMethod];
}

这样做可以防止无法识别的选择器崩溃。

此外,您应该将协议声明为NSObjects的扩展的原因。

代码语言:javascript
复制
@protocol MyProtocol <NSObject> 

是因为NSObject协议声明了respondsToSelector:选择器。否则XCode会认为调用它是不安全的。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3697058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档