/ /スタックブロックの寿命-Objective-C、Stack、Objective-C-Blocks

スタックブロックの寿命 - 目的関数-c、スタック関数、目的関数-cブロック

int (^b[3])();
for (int i=0; i<3; i++)
b[i] = ^{ return i;};
for (int i=0; i<3; i++)
printf("b %dn", b[i]());

最初のループでブロック構造が作成され、次に、この構造のアドレスがb [i]要素に割り当てられ、ブロック構造が破壊されます。質問は、2番目のループのb [i]がブロックの最後の状態への有効/同じポインターを含む理由です。要素が無効なスタック領域を指しているため、2番目のループがクラッシュすることが予想されます。

私はこれが最良のコードではないことを知っており、私はそれを使用していません。しかし、最初のループの後、ブロック構造が破壊されるはずのとき、有効なスタックオブジェクトを持っている理由を理解したいです。

回答:

回答№1は2

コードは、それが作成されたスコープ外のブロックを使用しているため、未定義の動作を示します。代わりにこれを書く必要があります:

b[i] = [^{ return i; } copy];

変数は次の理由で問題を引き起こしません。const修飾子が追加されたブロックのスコープに実際にコピーされます。 __block 修飾子。参照ブロックがコピーされたときに変数をスタックからヒープに移動する(つまり、アドレスを変更する)奇妙な副作用があります。