如何找出某个对象是否实现了特定的方法?

问题描述:

我正在遍历包含许多不同类型的对象的NSArray。有很多方法可以找出对象是什么类。但是,我一直无法找到一个很好的方法来查明一个对象是否可以实现一个特定的功能。我可以把它放在try-catch中,但即使我捕捉到错误,仍然会在控制台中输出错误消息。有一个更好的方法吗?如何找出某个对象是否实现了特定的方法?

简单的例子:

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

检查respondsToSelector尽可能多的有回答。在Objective-C中,除了编程错误之外,使用异常来控制程序流并不是一种好的风格(在我和其他人的观点中)。在这种情况下,如果您正在检查方法是否存在,则不合适。 – Abizern 2009-07-09 13:48:06

至于建议,您可以使用NSObject宣布respondsToSelector:消息。所提供的代码会像

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

+1,以获得链接和代码示例的最佳答案。 – 2009-07-09 14:33:11

看的NSObject的respondsToSelector方法

一个很好的通用类别,在你的代码是这样的:

@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)];