2010-12-15 11 views
70

estoy preguntando si hay una manera de llamar a un método en el que construyo el nombre del método sobre la marcha con una cadena.método de llamada C Objetivo de forma dinámica con una cadena

p. Ej. Tengo un método llamado loaddata

-(void)loadData; 

llamar a esto yo normalmente llamar así

[self loadData]; 

pero quiero ser capaz de llamar de forma dinámica con una cadena, por ejemplo,

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

Este es un ejemplo estúpido, pero espero que entiendas mi punto. Lo estoy usando para las clases de enlace de datos que estoy configurando para mi aplicación de IPad. Difícil de explicar, pero para que funcione, necesito resolver cómo llamar a un método con una cadena.

¿Alguna idea?

Gracias

+1

+1 para la pregunta clara, sencilla! – Linuxmint

+0

El método que quiero llamar es una función que devuelve un NSString. – IPadHackAndSlash

Respuesta

100

Puede intentar algo así como

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

En esta situación, el método devuelve un valor que es un NSString en un caso. Me sale un error que dice Lvalue requerido como operando de asignación izquierdo. Este es mi código: SEL s = NSSelectorFromString (@ "getIDString"); [self text] = [boundEntity performSelector: s]; – IPadHackAndSlash

+0

qué es [self text], donde asigna el valor return getIDString. – Ishu

+0

'[boundEntity performSelector: s]' devuelve un valor de tipo que no coincide con el tipo de '[texto libre]'. Creo que es necesario establecer @property para el texto y llamar '[auto setText: [[boundEntity performSelector: s]]] '. – shreyasva

11

Puede utilizar la función objc_msgSend. Se necesitan dos parámetros, el receptor y el selector para enviar a la misma:

objc_msgSend(self, someSelector); 

Tendrá que dar vuelta a su cadena en el selector apropiado usando NSSelectorFromString:

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

El método también tiene una variable número de argumentos, por lo que puede enviar mensajes con cualquier cantidad de argumentos.

NSString *message = [self getSomeSelectorNameWithManyArguments]; 
objc_msgSend(self, message, arg1, arg2, arg3, arg4); 
Cuestiones relacionadas