Objective C calling method dynamically with a string

31,796

Solution 1

You can try something like

SEL s = NSSelectorFromString(selectorName);
[anObject performSelector:s];

Solution 2

You can use the objc_msgSend function. It takes two parameters, the receiver and the selector to send to it:

objc_msgSend(self, someSelector);

You'll need to turn your string into the appropriate selector using NSSelectorFromString:

NSString *message = [self getSomeSelectorName];
objc_msgSend(self, message);

The method also takes a variable number of arguments, so you can send messages with any number of arguments.

NSString *message = [self getSomeSelectorNameWithManyArguments];
objc_msgSend(self, message, arg1, arg2, arg3, arg4);
Share:
31,796
IPadHackAndSlash
Author by

IPadHackAndSlash

Updated on July 05, 2022

Comments

  • IPadHackAndSlash
    IPadHackAndSlash almost 2 years

    Im just wondering whether there is a way to call a method where i build the name of the method on the fly with a string.

    e.g. I have a method called loaddata

    -(void)loadData;
    

    to call this i would normally call it like

    [self loadData];
    

    But i want to be able to call it dynamically with a string e.g.

    NSString *methodName = [[NSString alloc] initWithString:@"loadData"];
    [self methodName];
    

    This is a stupid example but i hope you get my point. I am using it for databinding classes that I am setting up for my IPad application. Hard to explain but to get it to fire I need to work out how to call a method with a string.

    Any ideas?

    Thanks

  • IPadHackAndSlash
    IPadHackAndSlash over 13 years
    In this situation the method returns a value which is an NSString in one case. I get an error saying Lvalue required as left operand of assignment. This is my code: SEL s = NSSelectorFromString(@"getIDString"); [self text] = [boundEntity performSelector:s];
  • Ishu
    Ishu over 13 years
    what is [self text],where you assign the value return getIDString.
  • shreyasva
    shreyasva over 13 years
    [boundEntity performSelector:s] returns a value of type that does not match the type of [self text]. I think you need to set @property for text and call [self setText:[[boundEntity performSelector:s]]].
  • malhal
    malhal over 10 years
    performSelector may cause a leak because selector is unknown!
  • SexyBeast
    SexyBeast over 9 years