1.什么是Block
- block的底层实现是结构体,和类的底层实现类似,都有isa指针
Block_layout结构体成员含义如下:- isa:指向所属类的指针,也就是block的类型
- flags:标志变量,在实现block的内部操作时会用到
- Reserved: 保留变量
- invoke: block执行时调用的函数指针,block内部的执行代码都在这个函数中
- descriptor: block的详细描述,包含copy/dispose函数,处理block引用外部变量时使用
- variables: block范围外的变量,如果block没有调用任何外部变量,该变量就不存在
Block_descriptor结构体成员含义如下:
- reserved: 保留变量
- size: block的内存大小
- copy: 拷贝block中被__block修饰的外部变量
- dispose: 和copy方法对应,释放变量
Block是将函数及其执行上下文封装起来的对象。
1.1 源码分析
- 通过clang的一个编译器命令来查看编译之后的文件内容
clang -rewrite-objc file.m
2.1 MCBlock.cpp
- I_MCBlock_method: I(当前类的实例方法),MCBlock(类名)
1.2 总结
- Block实际上就是一个对象,这个对象封装了函数以及函数的上下文
2.什么是Block调用
- Block调用即是函数的调用
2.1 Block调用的本质:源码解析