Nei documenti Apple: Un blocco letterale (ovvero,^{...}) è l'indirizzo di un struttura dati stack-locale che rappresenta il blocco. Il campo di applicazione della struttura di dati stack locale è quindi l'istruzione composta racchiude, si consiglia di evitare gli schemi riportati nei seguenti esempi:Non so quali schemi di blocco dovrei evitare per lo scope letterale nell'obiettivo-c
void dontDoThis() {
void (^blockArray[3])(void); // an array of 3 block references
for (int i = 0; i < 3; ++i) {
blockArray[i] = ^{ printf("hello, %d\n", i); };
// WRONG: The block literal scope is the "for" loop.
}
//for example I invoke the block here
blockArray[1]();
}
void dontDoThisEither() {
void (^block)(void);
int i = random():
if (i > 1000) {
block = ^{ printf("got i at: %d\n", i); };
// WRONG: The block literal scope is the "then" clause.
}
// ...
}
Non so quali modelli devo evitare. Sembra che potrei invocare il blocco in cui ha lo stesso ambito letterale della definizione di blocco, ad esempio dietro l'istruzione "if" o "for". Potresti per favore aiutarmi a spiegarlo?
Grazie. E vuoi dire che il blocco dovrebbe essere dichiarato come una proprietà copiata, invece di una variabile stack nel metodo? –
o posso dichiarare un blocco come variabile globale? In realtà, dovrebbe essere memorizzato anche nello stack locale, visto ovunque. –
Trovato! Grazie mille. L'istruzione composta di blocchi ha un valore intero sostanzialmente simile all'indirizzo di una struttura dati locale stack. –