Tôi biết rằng biến số __block
sẽ được chuyển sang vùng heap từ ngăn xếp nếu truy cập Chặn được sao chép. Nhưng mã thử nghiệm sau đây cho tôi thấy biến số __block
được di chuyển đến vùng heap trước khi sao chép một khối của.Tại sao biến __block được di chuyển đến heap TRƯỚC KHI khối được sao chép?
Tức là, bốn đầu ra là: stack => heap => heap => heap, không phải là kết quả mong đợi của tôi: stack => stack => stack => heap.
Ai đó có thể làm thẳng tôi không?
__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
lý do tại sao bạn quan tâm về vấn đề này không? và điều gì xảy ra với '__block int x; int * ptr = & x; 'nếu biến được chuyển từ stack sang heap? –
Đó là chi tiết triển khai. Bạn nên cố gắng không suy nghĩ quá nhiều về chúng. –
Ghi lại lớp của khối (có, khối là đối tượng) cũng hữu ích trong việc xác định nơi nó được sao chép vào ('__NSStackBlock__',' __NSMallocBlock__'). – CodaFi