OC目标 – Block 的实质
block – 代码块,开发中常用来封装一段代码,在想要履行的时候再调用履行,也常用来做传值、事件传递等等,是不可或缺的一个特性。可是如果使用不当,简单造成循环引证等问题。那block底层到底是怎么完成的呢
1. block的实质
1.1 查看block底层完成
- 写一个最根底的block
int main(int argc, const char * argv[]) {
@autoreleasepool {
void(^block)(void) = ^{
printf("block~~~n");
};
block();
}
return 0;
}
- 转成c++代码
-
struct __block_impl impl对应的便是 block 的底层结构
1.1.1 初始化block
- 刚刚声明的 block
void(^block)(void) = ^{
printf("block~~~n");
};
实际上它转成了
void(*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA));
他是初始化了一个__main_block_impl_0结构体,

__main_block_impl_0结构方法接纳两个参数void *fp和struct __main_block_desc_0 *desc,可以看到此处代码传入的值是(void *)__main_block_func_0和&__main_block_desc_0_DATA
这两个参数传进__main_block_impl_0后赋值给了 impl.FuncPtr和Desc
-
(void *)__main_block_func_0对应的是:
其实便是把咱们 block 里边所写的代码封装成函数传进去。
Desc则是block的描述信息,对应结构体__main_block_desc_0

reserved仅是个保留字段,Block_size则表示 block 的巨细
1.1.2 调用block
咱们初始化block后,通过block()调用了block
底层对应转成这样:
((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);
他实际上便是帮咱们调用了刚刚初始化时传入的保存在impl.FuncPtr的函数
此时block里边的代码就被调用履行了
@oubijiexi
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。





