2013-06-07 15 views
33

Ho una domanda sulla sintassi delle variabili __block. So che è possibile utilizzare __block su una variabile in ambito, quindi non è di sola lettura all'interno del blocco. Tuttavia in un punto nel apple docs, ho visto in alternativa:.Sintassi alternativa a __block?

"Variabili nel campo di applicazione che definisce sono di sola lettura per impostazione predefinita quando utilizzato in un blocco Se è necessario modificare il valore di tale variabile, può usare una sintassi particolare:

int count = 0; 
float cumulativeValue = 0.0; 
UpdateElements(a, N, ^(float element){ 
    |count, cumulativeValue| 
    float value = factor * element; 
    ++count; 
    cumulativeValue += value; 
    return value; 
}); 

in questo esempio, contare e cumulativeValue vengono modificati all'interno del blocco, in modo che sono inclusi in elenco separato da virgole di variabili condivise all'inizio del blocco dello scope.

Questa sintassi sembra molto più pulita e presumo che sia quindi possibile modificare le variabili che non si sono dichiarate ma che sono ancora in ambito. Tuttavia, non ho visto questo da nessun'altra parte e al compilatore xCode non piace il mio blocco di base. Questa sintassi è legittima?

risposta

45

Wow. Non ho visto quella sintassi da molto tempo.

Questa era una delle varie strutture sintattiche esplorate durante lo sviluppo dei blocchi. Alla fine è stato rifiutato perché era troppo impreciso nel dichiarare l'intenzione e il comportamento risultante sarebbe stato confuso.

Considerare un ambito con tre blocchi, due dei quali dichiarano una variabile come readwrite tramite |a|. Non ci sarebbe modo di sapere dalla dichiarazione int a = 5; nella parte superiore dello scope che il valore della variabile è readwrite in alcuni degli scope del blocco.

Inoltre, renderebbe l'implementazione del compilatore molto più difficile. La tradizione in C è che un tipo di memoria delle variabili è fisso al momento della dichiarazione. Il supporto di questa sintassi avrebbe infranto tale aspettativa.

Pertanto, è stato deciso di utilizzare un modificatore del tipo di archiviazione simile a volatile o static. __block è stato utilizzato principalmente perché il prefisso __ riduce notevolmente la quantità di codice che si interromperebbe aggiungendo una parola chiave nuda.

Grazie per avermelo chiesto. Bug archiviato e tale documentazione verrà riparata e/o rimossa alla fine.

+0

Molto interessante! Grazie per la cronologia –

+0

Quindi, qualche idea del perché la documentazione sia stata scritta prima di aver formalizzato la sintassi? – CodaFi

+4

Se la gente della documentazione non riesce a capire come spiegare qualcosa in modo coerente, è un segno sicuro che il design è seriamente imperfetto, quindi sono coinvolti nelle prime fasi del processo di progettazione. Questa documentazione potrebbe essere stata originariamente prodotta per il WWDC in cui sono stati annunciati per la prima volta i Blocks. – bbum

5

Il | | la sintassi è stata ispirata da Smalltalk, come era, naturalmente, il termine "blocco".

Come sottolinea bbum, contrassegnare il sito di decl è più onesto con il proprio. uso non-block e molto più in linea con C quando modellato, alla fine, come una nuova "durata" dell'oggetto (C).

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1451.pdf