^{
NSLog(@"this is a block!");
};
block不调用是不会执行的
如何调用block,直接添加()就可以调用了即
^{
NSLog(@"this is a block!");
}();
一般我们都会吧block存起来
void返回值block名称,(void)参数为空
void(^block)(void) = ^{
NSLog(@"this is a block!");
}
block();// 调用
所以block底层就是OC对象
拿FuncPtr调用这个函数,block的Function就是4句NSLog
重新整理
生成main.cpp
使main.cpp不参与编译
本质
执行block代码
void(^mhfBlock)(void) = ^{
NSLog(@"Hello,grit");
};
mhfBlock();
}
针对于这个block,首先会将
^{
NSLog(@"Hello,grit");
};
这一段代码封装到static void __main_block_func_0(struct __main_block_impl_0 *__cself)函数中
接着为这个mhfBlock生成一种数据结构
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
再调用结构体的构造函数创建结构体对象,并且吧结构体的地址赋值给mhfBlock这个变量,所以最终block变量就指向了我们这个结构体.
顺便吧函数地址和描述信息给结构体本身成员赋值