Skip to content

Commit

Permalink
添加__block的原理介绍【38-在block内如何修改block外部变量?】
Browse files Browse the repository at this point in the history
  • Loading branch information
ChenYilong committed May 17, 2016
1 parent 598a4a2 commit f9a0c7a
Showing 1 changed file with 8 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -691,13 +691,19 @@ autoreleasepool 以一个队列数组的形式实现,主要通过下列三个函
2016-05-17 02:03:33.559 LeanCloudChatKit-iOS[1505:713679] block内部: 0x155b22fc8
```

他们三个的内存地址转成10进制就是

“定义后”和“block内部”两者的内存地址是一样的,我们都知道 block 内部的变量会被 copy 到堆区,“block内部”打印的是堆地址,因而也就可以知道,“定义后”打印的也是堆的地址。


那么如何证明“block内部”打印的是堆地址?

把三个16进制的内存地址转成10进制就是:

1. 定义后前:6171559672
2. block内部:5732708296
3. 定义后后:5732708296

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

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

Expand Down

0 comments on commit f9a0c7a

Please sign in to comment.