iOS NSInvocation Objective-C


Esempio

Fai riferimento a questo post originale di e.James

Secondo il riferimento alla classe NSInvocation di Apple :

Un NSInvocation è un messaggio Objective-C reso statico, ovvero un'azione trasformata in oggetto.

E, in un piccolo dettaglio:

Il concetto di messaggi è centrale nella filosofia dell'obiettivo-c. Ogni volta che chiami un metodo o accedi a una variabile di qualche oggetto, stai inviando un messaggio. NSInvocation è utile quando si desidera inviare un messaggio a un oggetto in un momento diverso o inviare lo stesso messaggio più volte. NSInvocation consente di descrivere il messaggio che si sta per inviare e quindi di invocarlo (in realtà lo si invia all'oggetto di destinazione) in un secondo momento.


Ad esempio, supponiamo di voler aggiungere una stringa a un array. Normalmente si invierà il messaggio addObject: come segue:

[myArray addObject:myString];

NSInvocation ora che tu voglia utilizzare NSInvocation per inviare questo messaggio in un altro momento:

Innanzitutto, si prepara un oggetto NSInvocation da utilizzare con il selettore addObject: NSMutableArray :

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

Successivamente, devi specificare a quale oggetto inviare il messaggio:

[myInvocation setTarget:myArray];

Specifica il messaggio che desideri inviare a quell'oggetto:

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

E compila qualsiasi argomento per quel metodo:

[myInvocation setArgument:&myString atIndex:2];

Si noti che gli argomenti dell'oggetto devono essere passati dal puntatore. Grazie a Ryan McCuaig per averlo indicato e per favore vedi la documentazione di Apple per maggiori dettagli.

A questo punto, myInvocation è un oggetto completo, che descrive un messaggio che può essere inviato. Per inviare effettivamente il messaggio, chiameresti:

[myInvocation invoke];

Questo passaggio finale causerà l'invio del messaggio, eseguendo essenzialmente [myArray addObject:myString]; .

Pensa ad esso come mandare una email. Si apre una nuova email (oggetto NSInvocation ), si NSInvocation l'indirizzo della persona (oggetto) a cui si desidera inviarlo, si digita un messaggio per il destinatario (specificare un selector e gli argomenti), quindi fare clic su "invia" ( invoke chiamata).

Vedere Utilizzo di NSInvocation per ulteriori informazioni.


NSUndoManager utilizza oggetti NSInvocation modo che possa invertire i comandi. In sostanza, quello che stai facendo è creare un oggetto NSInvocation per dire: "Ehi, se vuoi annullare ciò che ho appena fatto, invia questo messaggio a quell'oggetto, con questi argomenti". NSInvocation oggetto NSInvocation a NSUndoManager e aggiunge quell'oggetto a una serie di azioni annullabili. Se l'utente chiama "Annulla", NSUndoManager cerca semplicemente l'azione più recente dell'array e richiama l'oggetto NSInvocation memorizzato per eseguire l'azione necessaria.

Vedi Registrazione delle operazioni di annullamento per maggiori dettagli.