Block 的底层实现
Block 的底层实现
原文件:
复制代码
通过 clang 命令将 OC 转为 C++代码来查看一下 Block 底层实现,clang 命令使用方式为终端使用 cd 定位到 main.m 文件所在文件夹,然后利用 clang -rewrite-objc main.m 将 OC 转为 C++,成功后在 main.m 同目录下会生成一个 main.cpp 文件
复制代码
__block_impl
结构体,它包含了isa
指针(包含 isa 指针的皆为对象),也就是说block
也是一个对象__main_block_impl_0
结构体,可以看出是根据所在函数(main 函数)以及出现序列(第 0 个)进行命名的,如果是全局的blcok
,就根据变量名和出现序列进行命名__main_block_impl_0
中包含了俩个成员变量和一个构造函数,成员变量分别是__block_impl
结构体和描述信息Desc
,之后在构造函数中初始化block
的类型信息和函数指针等信息__main_block_func_0
函数,其实对应的block
的函数体,该函数接受了一个__cself
参数,其实就是对应的block
本身__main_block_desc_0
结构体,其中比较有价值的信息是block
的大小main
函数对block
的创建,可以看出执行block
就是调用一个以block
自身为参数的函数,这个函数对应着block
的执行体
版权声明: 本文为 InfoQ 作者【NewBoy】的原创文章。
原文链接:【http://xie.infoq.cn/article/a731fd5245df332ef3bcfb464】。文章转载请联系作者。
评论