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
: