检查方法是否存在

tee*_*ink 109 objective-c

如果Objective-C中存在方法,我有什么办法可以测试吗?

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

ken*_*ytm 186

if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
   [obj methodName:123 withEtc:456];
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*mpo 72

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

[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
Run Code Online (Sandbox Code Playgroud)

或者像这样:

[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Run Code Online (Sandbox Code Playgroud)

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


Car*_*rum 12

使用respondsToSelector:.从文档:

respondsToSelector:

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

- (BOOL)respondsToSelector:(SEL)aSelector
Run Code Online (Sandbox Code Playgroud)

参数
aSelector - 标识消息的选择器.

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


Fra*_*rar 9

你正在寻找respondsToSelector: -

if ([foo respondsToSelector: @selector(bar)] {
  [foo bar];
}
Run Code Online (Sandbox Code Playgroud)

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