2011-10-31 5 views

risposta

4

L'obiettivo dei blocchi era di renderlo il più automatico e trasparente possibile per utilizzare i blocchi con sintassi minima e farli "funzionare".

Le variabili di blocco non -__, come predefinite, sono molto più in linea con la nozione di "chiusure" rappresentate dai blocchi. Un blocco cattura istantaneamente lo stato di tutte le variabili referenziate all'interno del blocco nel momento in cui l'esecuzione passa sopra la dichiarazione di blocco. Questo comprende sia la copia di memoria/stato e il mantenimento di qualsiasi riferimento all'oggetto Objective-C catturato nel blocco.

__block interrompe efficacemente l'incapsulamento di stato all'interno del blocco. Molto utile, ma richiede la gestione manuale dei riferimenti agli oggetti da parte del programmatore.

I.e. le variabili di blocco non -__ "funzionano" più spesso le variabili __block e, quindi, il comportamento predefinito era di gravitare su "funziona".

In pratica, il costo di acquisizione dello stato all'interno di un blocco è in genere minimo. L'impatto misurabile sulle prestazioni delle app è in genere raro e spesso indica un problema architettonico di natura più profonda.


Se da:

__block SelfClass * blockSelf = self; 

State si fa riferimento al prodotto incrociato di Blocchi e ARC? Sì, è un po 'sfortunato. Ma il compilatore avverte anche di un problema molto reale di cui devi essere a conoscenza. Tuttavia, una soluzione più pulita sarebbe ovviamente preferibile.

0

Perché __block potrebbe sopravvivere alla distruzione dello stack. Questo sarà evidente solo con C++ ambito variabili:

{ 
    __block shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will not be deleted until the block is destructed 
{ 
    shared_ptr<A> ptr = make_shared(new A); 
    self.some_block = ^(void){}; 
} // ptr will be deleted here 

E 'anche evidente con la raccolta dei rifiuti, ma la sua molto meno evidente e difficile da fare esempio.

+0

Non del tutto; in entrambi i casi, il blocco è un blocco ad albero in pila e, quindi, verrà distrutto con l'ambito. Devi copiare il blocco per farlo sopravvivere all'ambito. Inoltre, questo è solo un piccolo dettaglio di '__block'; là guerra molti altri fattori di guida. – bbum

Problemi correlati