【问题标题】:How can I find out if an object implements a particular method?如何确定对象是否实现了特定方法?
【发布时间】:2010-11-09 09:17:52
【问题描述】:

我正在遍历一个包含许多不同类型对象的 NSArray。有很多方法可以确定对象是什么类。但是,我还没有找到一个很好的方法来确定一个对象是否可以实现一个特定的功能。我可以将它放在 try-catch 中,但即使我发现错误,它仍会在控制台中输出错误消息。有没有更好的方法来做到这一点?

简单示例:

@try {
    if ([element lowercaseString]) {
        //do something
    }
}
@catch (id theException) {
    // do something else
}

【问题讨论】:

  • 检查 respondsToSelector,因为许多人已经回答了。在 Objective-C 中(在我和许多其他人看来)使用异常来控制程序流(除了编程中的错误)并不是一种好的风格。当您正在检查这种情况下是否存在方法时,它是不合适的。

标签: objective-c cocoa methods


【解决方案1】:

按照建议,您可以使用在NSObject 上声明的respondsToSelector: 消息。提供的代码就像

if ([element respondsToSelector:@selector(lowercaseString)]) {
    // ... do work
}

【讨论】:

  • 别忘了冒号是选择器不可分割的一部分。 @selector(catFish) 与 @selector(catFish:) 完全不同。
  • 嘿,有没有办法为属性做类似的事情?如果我有一个从数组中提取的通用 id 项,我想知道它是否具有某个属性...
【解决方案2】:

看看 NSObject 的 respondsToSelector 方法

【讨论】:

    【解决方案3】:

    您的代码中有一个很好的通用类别:

    @interface NSObject (KMExtensions)
    
    - (id)performSelectorIfResponds:(SEL)aSelector;
    - (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject;
    
    @end
    
    @implementation NSObject (KMExtensions)
    
    - (id)performSelectorIfResponds:(SEL)aSelector
    {
        if ( [self respondsToSelector:aSelector] ) {
            return [self performSelector:aSelector];
        }
        return NULL;
    }
    
    - (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject
    {
        if ( [self respondsToSelector:aSelector] ) {
            return [self performSelector:aSelector withObject:anObject];
        }
        return NULL;
    }
    
    @end
    

    然后你可以使用:

    [element performSelectorIfResponds:@selector(lowercaseString)];
    

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多