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"
Я не знаю, у чому ви точно сумніваєтесь, але думаю, що моя відповідь може вам допомогти.
Блок в основному виділяється на стеку, за умови нижче:
- Блок захоплює щонайменше одну змінну.
- Якщо ви не призначаєте блок змінній.
Блок буде виділятися на купі, коли:
- Блок захоплює щонайменше одну змінну.
- Якщо ви призначите блок будь-яким змінним (змінною члена або локальній змінній).
Блок буде виділятися на статичну область, коли:
- Блок нічого не захоплює.
Ура!