在main函数中声明一个block对象,在内部访问一个局部变量age:
int age = 10;void (^block)(void) = ^{NSLog(@"age = %d",age);};block();
将main.m转换成.cpp文件(参考:OC代码转换 ),转换后main函数内部代码:
int age = 10;// 创建blockvoid (*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对象。
