Check if a method exists

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

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

or like this:

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

This may be useful if you would like to call one constructor or another one depending on this (I mean, before having the instance itself).


Use respondsToSelector:. From the documentation:

respondsToSelector:

Returns a Boolean value that indicates whether the receiver implements or inherits a method that can respond to a specified message.

- (BOOL)respondsToSelector:(SEL)aSelector

Parameters
aSelector - A selector that identifies a message.

Return Value
YES if the receiver implements or inherits a method that can respond to aSelector, otherwise NO.


You're looking for respondsToSelector:-

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

As Donal says the above tells you that foo can definitely handle receiving the bar selector. However, if foo's a proxy that forwards bar to some underlying object that will receive the bar message, then respondsToSelector: will tell you NO, even though the message will be forwarded to an object that responds to bar.


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

Tags:

Objective C