Block 初探
Block 是什么
首先新建main.m
文件写下如下代码
1 | int main(int argc, const char * argv[]) { |
通过clang -rewrite-objc main.m -o main.cpp
将其转成.cpp
文件,发下如下代码。
1 | struct __block_impl { |
- 一个 block 实际是一个对象,它主要由一个 impl 和 一个 descriptor 组成。
- impl 里面存放了 isa 指针和 FuncPtr,所有对象都有 isa 指针,用于实现对象相关的功能,FuncPtr 是函数指针,指向具体的 block 实现的函数调用地址。
所以可以得出结论,Block
也可以看成是一个对象,因为他有isa
指针。
Block 的类型
通常会使用到的Block
类型为
_NSConcreteStackBlock 设置在栈上(编译器分配内存)
_NSConcreteGlobalBlock 设置在数据区域
_NSConcreteMallocBlock 设置在堆上(由程序员分配内存)
_NSConcreteStackBlock
局部定义的Block
,示例代码。
1 | int i = 0; |
clang
转换后
1 | struct __main_block_impl_0 { |
_NSConcreteGlobalBlock
全局定义的Block
,示例代码。
1 | void (^blk) () = ^{ |
clang
转换后
1 | struct __blk_block_impl_0 { |
当Block
不需要捕获auto
变量时。设置为_NSConcreteGlobalBlock
_NSConcreteMallocBlock
和_NSConcreteStackBlock
几乎相同。只不过用了objc_retainBlock
将其从占内存copy
到堆内存中。由程序员掌控生命周期。