Objective-C passing methods as parameters
Solution 1
The type you are looking for is selector (SEL
) and you get a method's selector like this:
SEL littleSelector = @selector(littleMethod);
If the method takes parameters, you just put :
where they go, like this:
SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:);
Also, methods are not really functions, they are used to send messages to specific class (when starting with +) or specific instance of it (when starting with -). Functions are C-type that doesn't really have a "target" like methods do.
Once you get a selector, you call that method on your target (be it class or instance) like this:
[target performSelector:someSelector];
A good example of this is UIControl
's addTarget:action:forControlEvents: method you usually use when creating UIButton
or some other control objects programmatically.
Solution 2
Another option is to look at blocks. It allows you to pass a block of code (a closure) around.
Here's a good write up on blocks:
http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1
Here's the apple docs:
Solution 3
Objective C makes this operation relatively easy. Apple provides this documentation.
To directly address your question, you are not calling a function, but a selector. Here is some sample code:
Big Function:
+ (void)theBigFunction:(SEL)func fromObject:(id) object{
[object preformSelector:func]
}
Then for class B:
- (void)littleBFunction {
NSLog(@"classB little function");
}
// somewhere else in the class
[ClassA theBigFunction:@selector(littleBFunction) fromObject:self]
Then for class C:
- (void)littleCFunction {
NSLog(@"classC little function");
}
// somewhere else in the class
[ClassA theBigFunction:@selector(littleCFunction) fromObject:self]
EDIT: Fix selectors sent (remove the semicolon)
Solution 4
You can use Blocks for this purpose. http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html
Jacksonkr
Another guy in a chair with questions & answers. jacksonkr.com
Updated on July 09, 2022Comments
-
Jacksonkr almost 2 years
How do you pass one method as a parameter to another method? I'm doing this across classes.
Class A:
+ (void)theBigFunction:(?)func{ // run the func here }
Class B:
- (void)littleBFunction { NSLog(@"classB little function"); } // somewhere else in the class [ClassA theBigFunction:littleBFunction]
Class C:
- (void)littleCFunction { NSLog(@"classC little function"); } // somewhere else in the class [ClassA theBigFunction:littleCFunction]
-
Jacksonkr over 12 yearsYou know how I would call the function once it is passed in? I doubt [self func] will work.
-
Filip Radelic over 12 years[target performSelector:someSelector];
-
Filip Radelic over 12 yearsYour selectors don't match method descriptions, there shouldn't be any
:
at the end of them. -
MJD over 12 yearsOops, sorry about that. I'm not much of an objective c coder (I've only dabbled in it) and I followed Apple's examples too closely!
-
ACLima almost 5 yearsThis should be accepted answer, as it is much more versatile. It also simplifies the case where passing arguments to the called method is dependent on context.