检查方法是否存在

时间:2010-04-28 20:24:38

标签: objective-c

有没有办法可以测试Objective-C中是否存在方法?

我正在尝试添加一个警卫,以便在调用之前查看我的对象是否具有该方法。

5 个答案:

答案 0 :(得分:185)

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

答案 1 :(得分:71)

还有静态消息 instancesRespondToSelector:(SEL)选择器 你会这样称呼它:

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

或者像这样:

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

如果您想根据此调用一个构造函数或另一个构造函数(我的意思是,在拥有实例之前),这可能很有用。

答案 2 :(得分:12)

使用respondsToSelector:。来自documentation

  

respondsToSelector:

     

返回一个布尔值,指示接收方是实现还是继承可以响应指定消息的方法。

- (BOOL)respondsToSelector:(SEL)aSelector
     

<强>参数
   aSelector - 标识邮件的选择器。

     

返回值
  YES如果接收方实现或继承了可以响应 aSelector 的方法,则为NO

答案 3 :(得分:9)

您正在寻找respondsToSelector: -

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

作为Donal says,上面告诉你foo可以肯定处理接收条形选择器。但是,如果foo是一个代理转发bar到某个将接收条消息的底层对象,那么respondsToSelector:会告诉你NO,即使该消息将被转发到响应bar的对象。

答案 4 :(得分:1)

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