Skip to content

Commit f9a0c7a

Browse files
committed
添加__block的原理介绍【38-在block内如何修改block外部变量?】
1 parent 598a4a2 commit f9a0c7a

File tree

1 file changed

+8
-2
lines changed

1 file changed

+8
-2
lines changed

01《招聘一个靠谱的iOS》面试题参考答案/《招聘一个靠谱的iOS》面试题参考答案(下).md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -691,13 +691,19 @@ autoreleasepool 以一个队列数组的形式实现,主要通过下列三个函
691691
2016-05-17 02:03:33.559 LeanCloudChatKit-iOS[1505:713679] block内部: 0x155b22fc8
692692
```
693693

694-
他们三个的内存地址转成10进制就是
694+
695+
“定义后”和“block内部”两者的内存地址是一样的,我们都知道 block 内部的变量会被 copy 到堆区,“block内部”打印的是堆地址,因而也就可以知道,“定义后”打印的也是堆的地址。
696+
697+
698+
那么如何证明“block内部”打印的是堆地址?
699+
700+
把三个16进制的内存地址转成10进制就是:
695701

696702
1. 定义后前:6171559672
697703
2. block内部:5732708296
698704
3. 定义后后:5732708296
699705

700-
中间相差 418.5M 的空间,又因为iOS中栈区的内存只有1M,Mac也只有8M,显然a已经是在堆区了。
706+
中间相差438851376个字节,也就是 418.5M 的空间,因为堆地址要小于栈地址,又因为iOS中栈区的内存只有1M,Mac也只有8M,显然a已经是在堆区了。
701707

702708
这也证实了我们的猜测:a 在定义前是栈区,但只要进入了 block 区域,就变成了堆区。这才是 `__block` 关键字的真正作用。
703709

0 commit comments

Comments
 (0)