/ / къде е блок в паметта Цел-С - цел-c, стек, блок

където е блок в паметта Цел-С - цел-в, стек, блок

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"

Не знам какво точно се съмнявате, но мисля, че моят отговор може да ви помогне.

  1. Блокът основно се разпределя на стека, при условие по-долу:

    • Блокът заснема поне една променлива.
    • Ако не зададете блока на променливата.
  2. Блокът ще бъде разпределен на купчина, когато:

    • Блокът заснема поне една променлива.
    • Ако присвоите блока на променливи (членна променлива или локална променлива).
  3. Блокът ще бъде разпределен в статичната област, когато:

    • Блокът не улавя нищо.

Наздраве!