Block简介
Block:块语法,本质上是匿名函数(没有名称的函数)
标准C没有Block,C语的后期扩展版本,加了匿名函数。
C++、JS、Swift等语言,有类似语法,叫做闭包。
Block是OC中的一种数据类型,在iOS开发中被广泛使用
^是Block的特有标记
Block的实现代码包含在{}之间
大多情况下,以内联inline函数的方式被定义和使用
Block与C语言的函数指针有些相似,但使用起来更加灵活
Block格式:
Int (^block)(int) = ^(int num) {return num;}
(返回类型)(^块名称)(参数类型) = ^(参数列表) {代码实现}
Block类型:int (^)(int)
Block变量:block
Block值:^ int (int num){ return num;}
注:如果没有参数,等号后面的参数列表可以删除。
例:
int (^block)(int x,int y) = ^(int x,int y){
return x + y;
};
int a = block(2 , 3);//block的使⽤和函数指针的使⽤类似。
NSLog(@“%d”,a);
打印结果:5
Block注意问题:
Block可以使用在定义之前声明的局部变量
int i = 10;
void(^myBlock)() = ^{
NSLog(@"%d", i);
};
i = 100;
myBlock();
该段代码的输出结果为10.
注意事项:
- 在定义Block时,会在Block中建立当前局部变量内容的副本(拷贝)
- 后续再对该变量的数值进行修改,不会影响Block中的数值
- block可以使用block之前的局部变量,但是不能对其进行修改
- 默认情况下,Block外部的变量,在Block中是只读的。
- 如果需要在block中保持局部变量的数值变化,需要使用__block关键字
- 使用__block关键字后,同样可以在Block中修改该变量的数值
- 在Block块语法中可以访问全局变量,并且可以修改全局变量