block 语法
block语法 -> 块语法
标准C里面没有Block, C语言的后期扩展版本, 加入了匿名函数; C++, JS, Swift等语言中, 有类似语法, 叫做闭包!
block语法和函数指针很相似
回顾, C语言中的指针函数:int(*) (int x, int y) 即: 指向两个整型参数, 一个整型返回值函数的指针!
Block函数, 没有名称的函数;
例如 int(int x, int y)
因为Block是匿名函数, block变量的存放的函数的实现, 通过block变量能直接调用函数, 没有名称的函数该如何调用呢? (有名称的话, 可以直接调用, 也可以通过函数指针来调用)
例如定义C语言的函数指针!
int sum (int x, int y) {
return x+ y;
}
// 定义函数
int (*p)(int, int) = sum;
NSLog(@"%ld", p(2, 5));
// 函数指针类型: int (*)(int, int);
// 函数指针变量: p;
// 函数指针的值: sum
看看block语法
block类型: int(^)(int, int)
block变量: block
block值: ^(int x, int y){
return x + y ;
};
定义block语法块
int (^block) (int , int) = ^(int x, int y) {
return x + y;
}
NSLog(@"%d", block(3, 5));
效果和上边的函数指针一样! 参照起来学习方便!
-
无返回值, 无参数 block 语法
void(^block1)(void) = ^(void) { NSLog(@"无返回值, 无参数"); } // 调用block1 block1();
有返回值, 无参数
int(^block2)(void) = ^(void) {
return 1;
}
NSLog(@"有返回值, 无参数%d", block2());无返回值, 有参数
void (^block3)(int, int) = ^(int x, int y){
NSLog(@"%d + %d = %d", x, y, x +y);
};
调用
block3(3, 5);有返回值, 有参数
int (^block4)(int , int) = ^(int x, int y) {
return x + y;
}
block 调用
NSLog(@"%d", block4(3, 5));
block 与变量的关系
- block 与 局部变量的关系
int temp = 100;
void (^block1)(void) = ^(void) {
NSLog(@"%d", temp++);
NSLog(@"%d", temp + 1);
}
调用 block1();
如果按照以上代码, 第一个打印会报错!! 因为对temp进行了操作, 也就是说在block中是不能修改局部变量的值的! 而第二个打印却不会报错, 说明block中可以调用局部变量! 那怎样才能在block中修改局部变量的值呢?
__block int temp2 = 200;
用__block修饰一下变量, 便在block可以使用了
__block int temp2 = 200;
void (^block9) (void) = ^(void){
temp2++; // 这样就可以修改了!
};
调用 block9();
结果 201; - block与全局变量.
在main函数外定义一个在main函数外定义一个temp3 = 300;
void (^block11) (void) = ^(void){
temp3++;
NSLog(@"temp3 = %d", temp3 + 1);
};
调用 block11();
结果 temp3 = 301;
说明block中可以修改全局变量!
block 用户熟练了, 用处大大的!!!