iOS NSInvocation Objective-C


Exemple

Reportez-vous à ce message original par e.James

Selon la référence de classe NSInvocation d' Apple :

Un NSInvocation est un message Objective-C rendu statique, c'est-à-dire une action transformée en objet.

Et, un peu plus en détail:

Le concept de message est au cœur de la philosophie objectif-c. Chaque fois que vous appelez une méthode ou accédez à une variable d'un objet, vous lui envoyez un message. NSInvocation est pratique lorsque vous souhaitez envoyer un message à un objet à un autre moment ou envoyer le même message plusieurs fois. NSInvocation vous permet de décrire le message que vous allez envoyer, puis de l' invoquer (l'envoyer effectivement à l'objet cible) ultérieurement.


Par exemple, supposons que vous souhaitiez ajouter une chaîne à un tableau. Vous devriez normalement envoyer le message addObject: comme suit:

[myArray addObject:myString];

Maintenant, supposons que vous souhaitiez utiliser NSInvocation pour envoyer ce message à un autre moment:

Tout d'abord, vous devez préparer un objet NSInvocation à utiliser avec addObject: selector de NSMutableArray :

NSMethodSignature * mySignature = [NSMutableArray
    instanceMethodSignatureForSelector:@selector(addObject:)];
NSInvocation * myInvocation = [NSInvocation
    invocationWithMethodSignature:mySignature];

Ensuite, vous spécifiez quel objet envoyer le message à:

[myInvocation setTarget:myArray];

Spécifiez le message que vous souhaitez envoyer à cet objet:

[myInvocation setSelector:@selector(addObject:)];

Et remplissez tous les arguments pour cette méthode:

[myInvocation setArgument:&myString atIndex:2];

Notez que les arguments d'objet doivent être passés par un pointeur. Merci à Ryan McCuaig de l' avoir signalé, et veuillez consulter la documentation d' Apple pour plus de détails.

À ce stade, myInvocation est un objet complet, décrivant un message pouvant être envoyé. Pour envoyer le message, vous devez appeler:

[myInvocation invoke];

Cette dernière étape entraînera l'envoi du message, en exécutant essentiellement [myArray addObject:myString]; .

Pensez-y comme envoyer un email. Vous ouvrez un nouvel email (objet NSInvocation ), NSInvocation l'adresse de la personne (objet) à qui vous voulez l'envoyer, tapez un message pour le destinataire (spécifiez un selector et des arguments), puis cliquez sur "envoyer" (appel invoke ).

Voir Utilisation de NSInvocation pour plus d'informations.


NSUndoManager utilise des objets NSInvocation pour pouvoir inverser les commandes. Essentiellement, vous créez un objet NSInvocation pour dire: "Hé, si vous voulez annuler ce que je viens de faire, envoyez ce message à cet objet, avec ces arguments". Vous donnez l'objet NSInvocation au NSUndoManager et il ajoute cet objet à un tableau d'actions annulables. Si l'utilisateur appelle "Annuler", NSUndoManager recherche simplement l'action la plus récente du tableau et appelle l'objet NSInvocation stocké pour effectuer l'action nécessaire.

Voir Enregistrement des opérations d'annulation pour plus de détails.