C语言函数指针
int func(int count)
正常调用:int result = func(10)
函数指针调用:
|
|
typedef给类型取一个别名
typedef int (^blk)(int)
给这个block类型取一个blk的名称
Block的实质
其实就是结构体__main_block_impl_0指针
|
|
Block结构体
|
|
注意这里也有个isa指针,我们知道OC的对象也有isa指针,说明Block其实也是一个对象
|
|
Block类型变量
|
|
|
|
Block的调用实质就是调用这个结构体指针所指向的函数blk();
|
|
截获变量
自动变量(局部变量)【在block函数中不能改变其值】
被截获的自动变量被保存到__main_block_impl_0结构体中,作为它的成员变量,如:
|
|
block函数转换为以下函数:
|
|
实际上是一个函数
|
|
静态变量【由于截获的是该变量的地址,所以在block函数中可以做任何操作】
与自动变量不同,被截获的静态变量的地址被保存到__main_block_impl_0结构体中,作为它的成员变量,如:
|
|
block函数转换为以下函数:
|
|
实际上是一个函数
|
|
静态全局变量
变量存储在全局区,不归block管不会被保存到block结构体中。在block函数中做任何操作都行
全局变量
变量存储在全局区,不归block管不会被保存到block结构体中。在block函数中做任何操作都行
截获对象
截获对象时Block结构体会多出一个__strong修饰符的对象如:
|
|
此外还会多两个函数:
当Block从栈复制到堆时调用
|
|
当Block废弃时调用
|
|
__block说明符
自动变量在block函数中是不能改变其值的,那如果要改变其值该怎么办?
在变量前加个__block修饰符就行了__block类似于static,用于指定该变量设置到哪个存储域中,如:
|
|
那么加了__block修饰符的自动变量将转换为一个结构体:
|
|
这样一来就跟静态变量一样,只要把__Block_byref_val_0的地址保存到__main_block_impl_0结构体中,作为它的成员变量,如:
|
|
block函数转换为以下函数:
|
|
实际上是一个函数
|
|
Block存储域
__NSConcreteGlobalBlock
全局block,存放在data区,以下为全局block: