¿Cómo funciona exactamente NSInvocation
? ¿Hay una buena introducción?
Tengo problemas específicos para comprender cómo funciona el siguiente código (de Cocoa Programming para Mac OS X, 3a edición ), pero también puedo aplicar los conceptos independientemente del ejemplo del tutorial. El código:
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index
{
NSLog(@"adding %@ to %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Insert Person"];
// Finally, add person to the array
[employees insertObject:p atIndex:index];
}
- (void)removeObjectFromEmployeesAtIndex:(int)index
{
Person *p = [employees objectAtIndex:index];
NSLog(@"removing %@ from %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] insertObject:p
inEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Delete Person"];
// Finally, remove person from array
[employees removeObjectAtIndex:index];
}
Entiendo lo que está tratando de hacer. (Por cierto, employees
es NSArray
de una Person
clase personalizada ).
Siendo un tipo .NET, trato de asociar conceptos desconocidos de Obj-C y Cocoa con conceptos más o menos análogos .NET. ¿Es esto similar al concepto de delegado de .NET, pero sin tipo?
Esto no está 100% claro en el libro, por lo que estoy buscando algo complementario de verdaderos expertos de Cocoa / Obj-C, nuevamente con el objetivo de que entiendo el concepto fundamental debajo del ejemplo simple (-ish). Realmente estoy buscando poder aplicar el conocimiento de forma independiente, hasta el capítulo 9, no tuve dificultades para hacerlo. Pero ahora ...
¡Gracias por adelantado!
fuente
setArgument:atIndex:
, por lo que la asignación de argumentos debería leerse[myInvocation setArgument:&myString atIndex:2]
.Aquí hay un ejemplo simple de NSInvocation en acción:
Cuando se llama -
[self hello:@"Hello" world:@"world"];
, el método:Al final, obtendrás una copia impresa así:
Por supuesto, el objeto de destino
self
debe continuar existiendo para que el NSTimer le envíe la NSInvocation. Por ejemplo, un objeto Singleton o un AppDelegate que existe mientras dura la aplicación.ACTUALIZAR:
Como se señaló anteriormente, cuando pasa una NSInvocation como argumento a un NSTimer, el NSTimer retiene automáticamente todos los argumentos de NSInvocation.
Si no está pasando una NSInvocation como argumento a un NSTimer y planea que se quede por un tiempo, debe llamar a su
-retainArguments
método. De lo contrario, sus argumentos pueden ser desasignados antes de que se invoque la invocación, lo que eventualmente ocasionará que su código se bloquee. Aquí se explica cómo hacerlo:fuente
invocationWithMethodSignature:
se use el inicializador, aún tenga que llamarsetSelector:
. Parece redundante, pero acabo de probar y es necesario.Puede intentar usar la biblioteca aquí, que es mucho mejor: http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
fuente
Construyo un ejemplo simple de llamar a varios tipos de métodos con NSInvocation.
Tuve problemas para llamar a varios parámetros usando obj_msgSend
https://github.com/clearbrian/NSInvocation_Runtime
fuente