__block
変数にアクセスするブロックがコピーされた場合、変数がスタックからヒープに移動されることはわかっています。しかし、次のテスト コードは、変数がブロックのコピーの前__block
にヒープに移動されることを示しています。
つまり、4 つの出力は次のとおりです: スタック => ヒープ => ヒープ => ヒープ、これは期待した結果ではありません: スタック => スタック => スタック => ヒープ。
誰かが私をまっすぐにすることができますか?
__block int x = 0;
int *pointerToX = &x;
//1. It's on the stack
NSLog(@"x's location is on the stack: %p", &x);
int (^block)() = ^{
x += 1;
return x;
};
//2. I think its stack, but it's heap
NSLog(@"x's location is on the %@: %p", (&x == pointerToX ? @"stack" : @"heap"), &x); //it's heap not stack
block();
//3. I think its stack, but it's heap
NSLog(@"x's location is on the %@: %p", (&x == pointerToX ? @"stack" : @"heap"), &x); //it's heap not stack
block = [block copy]; // The variable x will be moved to the heap
//4. I think its stack, but it's heap
NSLog(@"x's location is on the %@: %p", (&x == pointerToX ? @"stack" : @"heap"), &x); //heap