有没有办法可以测试Objective-C中是否存在方法?
我正在尝试添加一个警卫,以便在调用之前查看我的对象是否具有该方法。
答案 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,您可能需要确保没有更合适的方法来设计您的程序。