libdispatch
、
queue.h
のヘッダーファイルの1つに、次の警告が表示されます。
// The declaration of a block allocates storage on the stack.
// Therefore, this is an invalid construct:
dispatch_block_t block;
if (x) {
block = ^{ printf("true\n"); };
} else {
block = ^{ printf("false\n"); };
}
block(); // unsafe!!!
// What is happening behind the scenes:
if (x) {
struct Block __tmp_1 = ...; // setup details
block = &__tmp_1;
} else {
struct Block __tmp_2 = ...; // setup details
block = &__tmp_2;
}
// As the example demonstrates, the address of a stack variable is
// escaping the scope in which it is allocated. That is a classic C bug.
この問題を例示するテストケースはありません。スタック上にインスタンス化されたブロックを作成することはできますが、スタック上の一意のアドレスに常に現れるように見えます。
私はこれに対する答えが簡単だと思っていますが、それは私を逃れます。誰かが私の(限られた)理解のギャップを埋めることができますか?
EDIT:thisレスポンスを見たことがありますが、そのインスタンスが上に掲載された私の例にどのように変換できるかはよく分かりません。誰か私にif
構造を使った例を教えてもらえますか?
あなたが投稿したリンクは、別の問題、すなわち、変数が変化してもクロージャーが変わったように見えます。 JavaScriptのまったく同じ問題である["Javascript:closure of loop?"](http://stackoverflow.com/questions/5555464/javascript-closure-of-loop)の質問を参照してください。しかし、彼らはこのコメントで間違いを警告したようだ。最近、ブロックは自動的に自分自身をコピーしますか?私も知りたいのですが。 –
私はちょっと試しましたが、いつも同じ結果を得ています。ブロック構造体は関数スコープにあるようです。おそらく、たくさんの人が噛まれ、そのように変わったでしょうか? –