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ď č. 1V 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ť.
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.
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á).
Blok bude pridelený na statickú oblasť, keď:
- Blok nič nezachytáva.
Na zdravie!