Apple のドキュメントには次のように書かれています。ブロック リテラル (つまり、^{ ... }) は、ブロックを表すスタック ローカル データ構造のアドレスです。したがって、スタック ローカル データ構造のスコープは外側の複合ステートメントであるため、次の例に示すパターンは避ける必要があります。
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」ステートメントの後ろなど、ブロック定義と同じリテラルスコープを持つブロックを呼び出すことができたようです。説明を手伝っていただけませんか?