Quando dico blocco intendo:Qual è la differenza tra NSInvocation e il blocco?
^(int a) {return a*a;};
inoltre, blocco è solo un supporto per iOS4 e superiori.
Qual è la differenza tra questi due?
Quando dico blocco intendo:Qual è la differenza tra NSInvocation e il blocco?
^(int a) {return a*a;};
inoltre, blocco è solo un supporto per iOS4 e superiori.
Qual è la differenza tra questi due?
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.
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
.
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.
blocco è una funzione? o oggetto? Come dice @Justin: Il blocco è una definizione di funzione locale segreta – holsety
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. –