So che una variabile __block
verrà spostata nell'heap dalla pila se è stato copiato un blocco di accesso. Ma il seguente codice di test mi mostra che la variabile __block
viene spostata nell'heap prima della copia del blocco.Perché una variabile __block viene spostata nell'heap PRIMA che il blocco venga copiato?
Ovvero, le quattro uscite sono: stack => heap => heap => heap, che non è il risultato previsto: stack => stack => stack => heap.
Qualcuno potrebbe raddrizzarmi?
__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
perché vi preoccupate per questo comunque? e cosa succede a '__block int x; int * ptr = & x; 'se la variabile viene spostata da una pila all'altra? –
È un dettaglio di implementazione. Dovresti cercare di non pensare troppo a loro. –
La registrazione della classe del blocco (sì, i blocchi sono oggetti) è anche utile per determinare dove è stata copiata ('__NSStackBlock__',' __NSMallocBlock__'). – CodaFi