2009-07-05 13 views
7

Quiero configurar una tabla de envío de Método y me pregunto si es posible crear un puntero a un método en Objective-C (como un puntero para funcionar en C). Traté de usar algunas funciones de tiempo de ejecución de Objective-C para cambiar dinámicamente los métodos, pero el problema es que afectará a todas las instancias.Para Objective-C ... Puntero al método

Como soy nuevo en Objective-C, un ejemplo ilustrado sería muy apreciado.

Respuesta

16

Los métodos de Objective-C se llaman selector s, y están representados por el tipo de datos SEL. Si el objeto hereda de NSObject, se puede decir que para llevar a cabo un selector (es decir, llamar a un método) como así:

SEL selector = @selector(doSomething:); 
[obj performSelector:selector withObject:argument]; 

Esto supone que tiene un método definido como:

-(void)doSomething:(MyObject*)arg; 

Los selectores son asignado a SEL tipos de datos a través de la palabra clave @selector, que toma el nombre del método que le gustaría conservar. El nombre del método es el nombre del método despojado de todos los argumentos. Por ejemplo:

-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params 

sería referenciado como @selector(doSomething:withParams:).

+0

¡Oh, claro! Jason, muchas gracias! –

5

Sí! En Objective-C, los punteros a funciones se llaman selectores. Si usted tiene un método definido así:

- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2 
{ 
} 

El selector se declara así:

@selector(myFunctionWithObject:otherObject:) 

Para realizar un selector en un objeto, que puede utilizar:

[object performSelector:@selector(myFunction)]; 

o

[object performSelector:@selector(myFunctionTakingParameter:) withObject: o]; 

La se El tipo de datos de lector es particularmente útil para subprocesos y temporizadores, donde puede enviar un hilo y proporcionarle un selector al mensaje que desea invocar. Si necesita crear una matriz de selectores (o una tabla de despacho), o si necesita invocar selectores con múltiples parámetros, puede usar la clase NSInvocation. Proporciona un contenedor para un selector y le permite especificar argumentos reales.

Debe tener en cuenta que Objective-C ya está basado en una tabla de envío de métodos totalmente dinámica. Parece que mantener los punteros de función usando selectores funcionará bien para ti si solo necesitas una referencia a una función.

+0

Es posible que desee cambiar la segunda oración para que diga: Si tiene un MÉTODO así definido. – micmoo

+0

Muchas gracias, Ben. Sí, tiene toda la razón en que el tiempo de ejecución es en sí mismo una tabla de parches completamente dinámica. –

Cuestiones relacionadas