2012-02-27 21 views

risposta

0

Per dirla in parole semplici, NSInvocation è meno potente dei blocchi. Incapsula semplicemente una singola chiamata di metodo su un singolo oggetto, mentre i blocchi possono racchiudere molte righe di codice arbitrario. Anche il tuo blocco di squadratura molto semplice è impossibile da rappresentare usando un'invocazione senza il supporto di una classe esistente che farebbe la quadratura stessa.

3

Un NSInvocation è un messaggio (utilizzando un selettore) a un oggetto, con parametri facoltativi, che possono essere eseguiti in un secondo momento (o ora) e al di fuori del contesto corrente (mente ovviamente ciò che si copia o si conserva o si fa riferimento se si spostalo). NSInvocation ha il vantaggio che è possibile copiare/fare riferimento in modo selettivo a esattamente ciò che è necessario.

Il blocco è una definizione di funzione locale segreta, che è in grado di acquisire parti del contesto del thread corrente o del tutto. È anche un po 'più facile da configurare rispetto a uno NSInvocation perché acquisisce, copia e conserva automaticamente il contesto locale del thread (o dell'ambito). I blocchi possono aumentare leggermente le dimensioni binarie, in modo simile alle funzioni. Se preso fuori dal contesto locale (ad esempio quando si copia un blocco), i blocchi possono richiedere un po 'più di tempo e memoria della CPU - se confrontati con NSInvocation.

3

NSInvocation è un oggetto che incapsula una chiamata di messaggio: l'oggetto di destinazione, il selettore, gli argomenti e il valore di ritorno. Un blocco è un oggetto che incapsula una sezione di codice e alcune informazioni sullo stato del programma che porta a quella sezione: in particolare registra le variabili nello stack di chiamata fino alla creazione del blocco.

Entrambi possono essere utilizzati come richiami: è possibile utilizzare una chiamata per inviare un messaggio a un oggetto oppure è possibile eseguire il codice di un blocco come una funzione. Ciò che è diverso su di loro è il modo in cui trasporti lo stato in ciascun caso. Con un'invocazione, è necessario l'oggetto di destinazione o uno dei parametri per rappresentare il contesto in cui viene visualizzato il messaggio. Con un blocco, questo contesto viene catturato automaticamente dallo stato quando il blocco è stato creato.

+0

blocco è una funzione? o oggetto? Come dice @Justin: Il blocco è una definizione di funzione locale segreta – holsety

+0

Sono entrambi :). Un blocco è una funzione anonima, insieme a una copia dello stack nel momento in cui hai creato il blocco (più o meno). È anche un oggetto Objective-C, quindi è possibile creare copie del blocco e successivamente rilasciare tali copie. Quando esegui il blocco, stai solo chiamando la sua funzione; sebbene il runtime imposta anche la pila del blocco prima di entrare nella funzione. –

Problemi correlati