Pregunta

Quiero fijar una tabla de métodos de despacho y me pregunto si es posible crear puntero a un método en Objective-C (como puntero a funcionar en C). He intentado utilizar algunas funciones de tiempo de ejecución de Objective-C para cambiar dinámicamente métodos pero el problema es que afectará a todas las instancias.

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

¿Fue útil?

Solución

métodos Objective-C se denominan selectors, y están representadas 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 se asignan a SEL tipos de datos a través de la palabra clave @selector, que lleva el nombre del método que desea 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

¿Quieres ser referenciado como @selector(doSomething:withParams:).

Otros consejos

Sí! En Objective-C, los punteros de función son llamados selectores. Si ha definido un método como este:

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

El selector se declara así:

@selector(myFunctionWithObject:otherObject:)

Para realizar un selector en un objeto, puede utilizar:

[object performSelector:@selector(myFunction)];

o

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

El selector de tipo de datos es particularmente útil para las discusiones y temporizadores, donde se puede despachar un hilo, y para dotarla de un selector en el mensaje que le guste a invocar. Si necesita crear una matriz de selectores (o una mesa de despacho), o si es necesario invocar selectores con múltiples parámetros, puede utilizar la clase NSInvocation. Proporciona un contenedor para un selector y le permite especificar argumentos reales.

Usted debe tener en cuenta que Objective-C ya se basa en una tabla de métodos de despacho completamente dinámico. Suena como el mantenimiento de los punteros de función usando selectores no tendrán ningún problema para usted si sólo tiene una referencia a una función, sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top