在main函数中声明一个block对象,在内部访问一个局部变量age:
int age = 10;
void (^block)(void) = ^{
NSLog(@"age = %d",age);
};
block();
将main.m转换成.cpp文件(参考:OC代码转换 ),转换后main函数内部代码:
int age = 10;
// 创建block
void (*block)(void) = &__main_block_impl_0(
__main_block_func_0,
&__main_block_desc_0_DATA,
age
);
// 执行block方法
block->FuncPtr(block);
其中main_block_func_0封装了block内部执行的函数,最后会赋值给FuncPtr,main_block_desc_0_DATA保存了block描述信息,age会保存到block结构体中。
block结构体代码:
// block结构体
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
int age;
};
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
}
block数据结构如下图所示:
由于block底层也是结构体,且也存在isa指针,所以可推断出block本质是OC对象。
打印block的class、block的父类以及父类的父类
NSLog(@"block.class = %@",[block class]);
NSLog(@"block.class.superclass = %@",[[block class] superclass]);
NSLog(@"block.class.superclass.superclass = %@",[[[block class] superclass] superclass]);
打印结果:
~:block.class = __NSMallocBlock__
~:block.class.superclass = NSBlock
~:block.class.superclass.superclass = NSObject
这样进一步印证了block就是一个继承于NSBlock的OC对象。