/ / dove si trova il blocco in memoria Obiettivo-C - obiettivo-c, pila, blocco

dove è il blocco in memoria Objective-C - objective-c, stack, block

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 № 1

Nel 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.

  1. Il blocco è sostanzialmente allocato nello stack, alle seguenti condizioni:

    • Il blocco acquisisce almeno una variabile.
    • Se non si assegna il blocco alla variabile.
  2. 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).
  3. Il blocco verrà allocato nell'area statica quando:

    • Block non cattura nulla.

Saluti!