int b = 100;
NSLog(@"b in stack:%p", &b);
NSString *str1 = @"Hello World";
NSLog(@"&str1 in stack:%p", &str1);
NSLog(@"block:%p", ^(){});
id block = ^(){};
NSLog(@"block in heap: %p", block);
quindi, il registro è qui:
b in stack:0x7fff5fbff75c
&str1 in stack:0x7fff5fbff750
block:0x100001170
block in heap: 0x1000011b0
Ho cercato molti blog, molti dicono NSLog(@"block:%p", ^(){});
"blocco nello stack, ma perché è diverso dai primi due in base ai registri degli indirizzi?
risposte:
3 per risposta № 1Nel primo stai stampando l'indirizzo della variabile locale, che è nello stack. Negli ultimi due il blocco è allocato nell'heap e si sta stampando il suo indirizzo. Provare NSLog(@"block in heap: %p", &block);
e vedrai che stampa l'indirizzo dove block
la variabile è memorizzata, invece il suo contenuto. Nel terzo caso non puoi farlo poiché stai creando una variabile temporale direttamente sull'argomento.
0 per risposta № 2
Se vuoi vedere l'indirizzo di memoria del blocco, usa
@"%@"
di @"%p"
Non so esattamente di cosa dubiti, ma penso che la mia risposta possa aiutarti.
Il blocco è sostanzialmente allocato nello stack, alle seguenti condizioni:
- Il blocco acquisisce almeno una variabile.
- Se non si assegna il blocco alla variabile.
Il blocco verrà allocato sull'heap quando:
- Il blocco acquisisce almeno una variabile.
- Se si assegna il blocco a qualsiasi variabile (variabile membro o variabile locale).
Il blocco verrà allocato nell'area statica quando:
- Block non cattura nulla.
Saluti!