/ / kde je blok v pamäti Objective-C - object-c, stack, block

kde je blok v pamäti Objective-C - objektív-c, stoh, blok

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);

potom je tu záznam:

b in stack:0x7fff5fbff75c
&str1 in stack:0x7fff5fbff750
block:0x100001170
block in heap: 0x1000011b0

Vyzeral som veľa blogov, mnohí hovoria NSLog(@"block:%p", ^(){});je blok v zásobníku, ale prečo sa líši od prvých dvoch podľa denníkov adries?

odpovede:

3 pre odpoveď č. 1

V prvom tlačíte adresu miestnej premennej, ktorá je v zásobníku. V posledných dvoch je blok pridelený na hromadu a tlačíte jeho adresu. vyskúšať NSLog(@"block in heap: %p", &block); a uvidíte, že vytlačí adresu, na ktorej block premenná, namiesto jej obsahu. V treťom prípade to nemôžete urobiť, pretože vytvárate časovú premennú priamo na argumente.


0 pre odpoveď č. 2

Ak chcete vidieť adresu pamäte bloku, použite

@"%@" než @"%p"

Neviem, o čom presne pochybujete, ale myslím si, že moja odpoveď vám môže pomôcť.

  1. Blok sa v zásade prideľuje na komíne, ak je to uvedené nižšie:

    • Blok zachytáva najmenej jednu premennú.
    • Ak blok nepriradíte k premennej.
  2. Blok bude pridelený na haldu, keď:

    • Blok zachytáva najmenej jednu premennú.
    • Ak blok priradíte ľubovoľným premenným (členská premenná alebo lokálna premenná).
  3. Blok bude pridelený na statickú oblasť, keď:

    • Blok nič nezachytáva.

Na zdravie!