objective-c - studio - superponer graficas en r
¿Es posible pasar un método como argumento en Objective-C? (3)
NSInvocation es una clase para completar un método llamado en un objeto. Puede establecer un selector (firma de método), establecer argumentos por índice. A continuación, puede establecer un destino e invocación de llamada para activar la llamada, o dejar el objetivo sin configurar y usar invokeWithTarget: en un bucle de algún tipo para llamar esto a muchos objetos.
Creo que funciona un poco como esto:
NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];
for (MyClass *myObj in myObjects) {
[inv invokeWithTarget:myObj];
}
O si no desea pasar objetos de invocación a este método, puede usar el tipo SEL para aceptar un selector (firma de método).
-(void)fooWithMethod:(SEL)selector;
A continuación, asigne el selector a un objeto de invocación para llamarlo a los objetos.
Tengo un método que varía por una sola llamada al método en el interior, y me gustaría pasar el método / firma del método que varía como argumento ... ¿es posible esto en el Objetivo C o es demasiado para esperar? ¿para?
Como se dijo antes, puede pasar el selector del método que desea llamar. Usando un selector hay diferentes maneras de llamar realmente al método:
- utilizando
NSObject
sperformSelector:
performSelector:withObject:
yperformSelector:withObject:withObject:
methods - utilizando un objeto
NSInvocation
- o directamente usando
objc_msgSend
uobjc_msgSend_stret
- usando el
IMP
de ese método que puedes obtener usandomethodForSelector:
Cuál usar realmente depende de la situación. Si el rendimiento no es crítico, seguiré con 1 si necesitas pasar 0, 1 o 2 objetos. Si los métodos performSelector:...
no coinciden, iría con 2 o 3. Dado que configurar un objeto NSInvocation
requiere mucho código repetitivo, prefiero 3, pero supongo que es una cuestión de elección personal, a menos que haya problemas de desempeño.
Si el rendimiento de esas llamadas al método importa, usaría 3 o 4. 3 debería ser más rápido a menos que pueda almacenar en caché los IMP
. Pero dependiendo de su código esto puede no ser factible o realmente no ayuda. Entonces aquí debe perfilar el código y ver cuál es mejor para usted.
O si está utilizando el fooWithMethod:(SEL)selector
, simplemente haga [myObject performSelector:selector]
en él, si no tiene otros argumentos.