检查一个方法是否存在

有什么方法可以testing一个方法是否存在于Objective-C中?

我试图添加一个警卫,看看我的对象是否有调用之前的方法。

 if ([obj respondsToSelector:@selector(methodName:withEtc:)]) { [obj methodName:123 withEtc:456]; } 

还有静态消息instancesRespondToSelector:(SEL)select器你可以这样调用它:

 [MyClass instancesRespondToSelector:@selector(someMethod:withParams:)] 

或者像这样:

 [[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)] 

这可能是有用的,如果你想调用一个构造函数或另一个取决于此(我的意思是,在实例本身之前)。

使用respondsToSelector: 从文档 :

respondsToSelector:

返回一个布尔值,该值指示接收方是否实现或inheritance可响应指定消息的方法。

 - (BOOL)respondsToSelector:(SEL)aSelector 

参数
aSelector – 标识消息的select器。

返回值
如果接收者实现或inheritance了可以响应select器的方法, 则为YES ,否则为NO

你正在寻找respondsToSelector: –

 if ([foo respondsToSelector: @selector(bar)] { [foo bar]; } 

正如Donal所说 ,上面告诉你,foo 绝对可以处理接收条形select器。 但是,如果foo是一个将bar转发给某个会接收bar消息的底层对象的代理,那么即使该消息将被转发到响应bar的对象,respondsToSelector也会告诉您NO。

使用respondsToSelector检查select器通常只用于委托方法。 您不应该使用forwardInvocation或代理方法的代理。 如果您需要在其他情况下使用respondsToSelector,则可能需要确保没有更合适的方法来devise程序。