/ / де блок в пам'яті Objective-C - aim-c, stack, block

де - блок пам'яті Objective-C - об'єкт-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", ^(){});"s" блок у стеці, але чому він відрізняється від перших двох відповідно до журналів адрес?

Відповіді:

3 для відповіді № 1

У першому вам друкується адреса локальної змінної, яка знаходиться в стеці. В останніх двох блоках виділяється в купі, і ви друкуєте його адресу. Спробуйте NSLog(@"block in heap: %p", &block); і ви побачите, що він друкує адресу, де block змінна зберігається, замість її вмісту. У третьому випадку цього не можна робити, оскільки ви створюєте тимчасову змінну безпосередньо на аргументі.


0 для відповіді № 2

Якщо ви хочете побачити адресу пам'яті блоку, використовуйте

@"%@" ніж @"%p"

Я не знаю, у чому ви точно сумніваєтесь, але думаю, що моя відповідь може вам допомогти.

  1. Блок в основному виділяється на стеку, за умови нижче:

    • Блок захоплює щонайменше одну змінну.
    • Якщо ви не призначаєте блок змінній.
  2. Блок буде виділятися на купі, коли:

    • Блок захоплює щонайменше одну змінну.
    • Якщо ви призначите блок будь-яким змінним (змінною члена або локальній змінній).
  3. Блок буде виділятися на статичну область, коли:

    • Блок нічого не захоплює.

Ура!