В яблочных документах сказано: Блок-литерал (т.е. ^ {...}) является адресом локальной структуры данных стека, которая представляет блок. Таким образом, объем локальной структуры данных стека является составной составной формулой, поэтому вам следует избегать шаблонов, показанных в следующих примерах:
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.
}
// ...
}
Я не знаю, какие шаблоны я должен избегать. Похоже, что я мог бы вызывать блок, у которого есть такая же область литералов, что и определение блока, например, за выражением "if" или "for". Не могли бы вы помочь мне объяснить это?