¿Cómo funciona exactamente NSInvocation
? ¿Hay una buena introducción?NSInvocación para Dummies?
Estoy específicamente teniendo problemas para entender cómo funciona el siguiente código (desde Cocoa Programming para Mac OS X, 3ra Edición), pero también puede 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, es un employees
NSArray
de una clase personalizada Person
.)
ser un tipo .NET, trato de asociar conceptos desconocidos Obj-C y Cocoa de conceptos de .NET más o menos análogos. ¿Es esto similar al concepto de delegado de .NET, pero sin tipo?
Esto no está 100% claro del libro, entonces estoy buscando algo suplementario de expertos reales de Cocoa/Obj-C, una vez más con el objetivo de entender 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 ninguna dificultad para hacerlo. Pero ahora ...
¡Gracias de antemano!
Una pequeña corrección a una por lo demás excelente respuesta ... usted tiene que pasar un puntero a objetos en 'setArgument: atIndex:', por lo que el arg la tarea debería leer '[myInvocation setArgument: & myString atIndex: 2]'. –
@Ryan McCuaig: Gracias por señalar eso. Realicé el cambio y agregué un enlace a la documentación relevante. –
Solo para aclarar la nota de Ryan, el índice 0 está reservado para "self" y el índice 1 está reservado para "_cmd" (consulte el enlace e.James publicado para obtener más detalles). Entonces su primer argumento se coloca en el índice 2, el segundo argumento en el índice 3, etc. ... –