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);
след това дневникът е тук:
b in stack:0x7fff5fbff75c
&str1 in stack:0x7fff5fbff750
block:0x100001170
block in heap: 0x1000011b0
Погледнах много блогове, много казват NSLog(@"block:%p", ^(){});
блок в стека, но защо това е различно от първите две според адресите на адресите?
Отговори:
3 за отговор № 1При първото отпечатване на адреса на локалната променлива, която е в стека. В последните два блока се разпределя в купчината и вие печатате адреса му. Опитвам NSLog(@"block in heap: %p", &block);
и ще видите, че отпечатва адреса, на който се намира block
променливата се съхранява, а съдържанието му. В третия случай не можете да го направите, тъй като създавате временна променлива директно върху аргумента.
0 за отговор № 2
Ако искате да видите адреса на паметта на блока, използвайте
@"%@"
от @"%p"
Не знам какво точно се съмнявате, но мисля, че моят отговор може да ви помогне.
Блокът основно се разпределя на стека, при условие по-долу:
- Блокът заснема поне една променлива.
- Ако не зададете блока на променливата.
Блокът ще бъде разпределен на купчина, когато:
- Блокът заснема поне една променлива.
- Ако присвоите блока на променливи (членна променлива или локална променлива).
Блокът ще бъде разпределен в статичната област, когато:
- Блокът не улавя нищо.
Наздраве!