Comment ça NSInvocation
marche exactement ? Y a-t-il une bonne introduction?
J'ai spécifiquement des problèmes pour comprendre le fonctionnement du code suivant (de Cocoa Programming pour Mac OS X, 3e édition ), mais je peux également appliquer les concepts indépendamment de l'exemple du didacticiel. Le code:
- (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];
}
Je comprends ce qu'il essaie de faire. (BTW, employees
est une classe NSArray
personnalisée Person
.)
Étant un gars .NET, j'essaie d'associer des concepts Obj-C et Cocoa inconnus à des concepts .NET à peu près analogues. Est-ce similaire au concept de délégué de .NET, mais non typé?
Ce n'est pas clair à 100% dans le livre, donc je recherche quelque chose de supplémentaire de la part de vrais experts Cocoa / Obj-C, toujours dans le but de comprendre le concept fondamental sous l'exemple simple (-ish). Je cherche vraiment à pouvoir appliquer les connaissances de manière indépendante - jusqu'au chapitre 9, je n'avais aucune difficulté à le faire. Mais maintenant ...
Merci d'avance!
la source
setArgument:atIndex:
, donc l'affectation arg devrait réellement lire[myInvocation setArgument:&myString atIndex:2]
.Voici un exemple simple de NSInvocation en action:
Lorsqu'elle est appelée -
[self hello:@"Hello" world:@"world"];
- la méthode:À la fin, vous obtiendrez une impression comme ceci:
Bien entendu, l'objet cible
self
doit continuer d'exister pour que le NSTimer lui envoie le NSInvocation. Par exemple, un objet Singleton ou un AppDelegate qui existe pendant la durée de l'application.METTRE À JOUR:
Comme indiqué ci-dessus, lorsque vous passez un NSInvocation en tant qu'argument à un NSTimer, le NSTimer conserve automatiquement tous les arguments de NSInvocation.
Si vous ne passez pas une NSInvocation en tant qu'argument à un NSTimer et que vous prévoyez de la laisser rester un moment, vous devez appeler sa
-retainArguments
méthode. Sinon, ses arguments peuvent être désalloués avant que l'invocation ne soit invoquée, provoquant éventuellement le blocage de votre code. Voici comment procéder:la source
invocationWithMethodSignature:
initialiseur est utilisé, vous devez toujours appelersetSelector:
. Cela semble redondant, mais je viens de tester et c'est nécessaire.Vous pouvez simplement essayer d'utiliser la bibliothèque ici, ce qui est beaucoup plus agréable: http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
la source
Je construis un exemple simple d'appel de divers types de méthodes avec NSInvocation.
J'ai eu des problèmes pour appeler plusieurs paramètres en utilisant obj_msgSend
https://github.com/clearbrian/NSInvocation_Runtime
la source