前言:
以下文字都是摘自ios与osx多线程和内存管理一书,方便以后自己过来查阅的.
本文梗概:Block的实质:Block究竟是什么?本节将通过Block的实现进一步帮大家加深理解。。
1. Blocks的实现
:
1.3 Block存储域
:
通过前面说明可知,Block转换为Block的结构体类型的自动变量__block变量
转换为__block变量的结构体类型
的自动变量。所谓结构体类型的自动变量,即栈上生成的该结构体的实例。如表4-1所示
名称 | 实质 |
---|---|
Block | 栈上Block的结构体实例 |
__block变量 | 栈上__block变量的结构体实例 |
另外,通过之前的说明可知Block也是oc对象。将Block当作oc对象来看时,该Block的类为_NSConcreteStackBlock
.虽然该类没有出现在已变换源代码中,但有很多与之类似的类,如:
_NSConcreteStackBlock
_NSConcreteGlobalBlock
_NSConcreteMallocBlock
首先,我们能注意到_NSConcreteStackBlock
类的名称中含有“栈”(stack)一词,即该类的对象Block设置在栈上。
同样地,_NSConcreteGlobalBlock
类对象如其名“全局”(global)所示,与全局变量一样,设置在程序的数据区域(.data区)中。_NSConcreteMallocBlock
类对象则设置在由malloc函数分配的内存块(即堆)中。
具体整理如表4-2及图4-3所示
###表4-2 Block的类
类 | 设置对象的存储域 |
---|---|
_NSConcreteStackBlock |
栈 |
_NSConcreteGlobalBlock |
程序的数据区域(.data区) |
_NSConcreteMallocBlock |
堆 |