Check if a method exists

Is there any way I can test if a method exists in Objective-C?

I'm trying to add a guard to see if my object has the method before calling it.

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

使用 respondsToSelector:。从 文件:

返回文章页面选择器:

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

- (BOOL)respondsToSelector:(SEL)aSelector

参数
aSelector - A selector that identifies a message.

返回值
如果接收方实现或继承能够响应 选择器的方法,则为 YES,否则为 NO

你在找 返回文章页面选择器:-

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

作为 多纳尔说,上面告诉您 foo 可以 当然处理接收条选择器。但是,如果 foo 是一个代理,它将 bar 转发给一些将接收 bar 消息的底层对象,那么 response dsToSelector: 将告诉你 NO,即使消息将被转发给一个响应 bar 的对象。

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

There is also the static message instancesRespondToSelector:(SEL)selector You would call it like this:

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

或者像这样:

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

如果您希望根据这一点调用一个构造函数或另一个构造函数(我的意思是,在拥有实例本身之前) ,那么这可能很有用。