本文会记录下最近对B lock 的一些探究,先从 block 是如何对局部变量捕获开始讲起.
上边的代码 auto变量的值改变时,block 内部输出结果还是10,而 static 的局部变量 值变成了50. 那么 block 内部是如何对age height 进行处理的呢?
可以通过 xcrun -sdk phones clang -arch arm64 -rewrite-objc main.c -o main.cpp 将OC代码转成C++代码实现
void testBlock() {
auto int age = 10;
static int height = 100;
void(*block)(void) = &__testBlock_block_impl_0(
&__testBlock_block_func_0,
&__testBlock_block_desc_0_DATA, age, &height));
age = 20;
height = 50;
block->FuncPtr(block);
__testBlock_block_func_0 block实现部分的代码
__testBlock_block_desc_0_DATA block 内存占用大小 描述信息
__testBlock_block_impl_0 构造方法 返回一个 __testBlock_block_impl_0 结构体对象 并且取地址 复制给 *block 变量
block->FuncPtr 实质就是 block->impl.FuncPtr 由于结构体内部第一个成员就是该结构体的内存地址 ,所以 _