Block 的分类
Block 的分类
NSConcreteGlobalBlock
全局的静态block
,不会访问任何外部变量。NSConcreteStackBlock
保存在栈中的block
,当函数返回时会被销毁。NSConcreteMallocBlock
保存在堆中的block
,当引用计数为 0 时会被销毁。
NSConcreteGlobalBlock 类型的 block 的实现
复制代码
testGlobalBlock 的isa
指向了_NSConcreteGlobalBlock
,即在全局区域创建,block
变量存储在全局数据存储区
NSConcreteStackBlock 类型的 block 的实现
复制代码
testStackBlock 的isa
指向了_NSConcreteStackBlock
,即在栈区创建。
NSConcreteMallocBlock 类型的 block 的实现
复制代码
NSConcreteMallocBlock
类型的 block
通常不会在源码中直接出现,其需要由_NSConcreteStackBlock
类型的block
拷贝而来(也就是说block
需要执行copy
之后才能存放到堆中)。
其内部通过函数 memmove 将栈中的block
的内容拷贝到了堆中,并使isa
指向了_NSConcreteMallocBlock
。
block
主要的一些学问就出在栈中block
向堆中block
的转移过程中了。
版权声明: 本文为 InfoQ 作者【NewBoy】的原创文章。
原文链接:【http://xie.infoq.cn/article/d7dd41da8844b3eb8baa635f5】。文章转载请联系作者。
评论