检查一个方法是否存在
有什么方法可以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程序。