# Block 概述
标准C里面没有Block, C语言的后期扩展版本, 加入了匿名函数; C++、JS、 Swift等语言中, 有类似语法, 叫做闭包!
block语法和函数指针很相似。回顾, C语言中的指针函数:
c
int(*) (int x, int y)
即: 指向两个整型参数, 一个整型返回值函数的指针!
Block函数, 没有名称的函数,例如:
int(int x, int y)
因为Block是匿名函数, block变量存放函数的实现, 通过block变量能直接调用函数, 没有名称的函数该如何调用呢? (有名称的话, 可以直接调用, 也可以通过函数指针来调用)
例如定义C语言的函数指针!
int sum(int a, int b) {
return a + b;
}
// 定义函数
int (*p)(int, int) = sum;
NSLog(@"%ld", p(10, 10)); // 20
// 函数指针类型:int (*) (int, int)
// 函数指针变量:p
// 函数指针的值:sum
看看block语法:
block类型: int(^)(int, int)
block变量: block
block的值: ^(int a, int b){
return a + b ;
};
定义block语法块:
int (^block)(int int) = ^(int a, int b) {
return a + b;
}
# Block 类型
// 1. 无参数无返回值
void(^sayHello)(void) = ^(void) {
NSLog(@"Hello!");
};
// 2. 有参数无返回值
void(^sayHelloWith)(char *) = ^(char *name) {
NSLog(@"Hello, %s!", name);
};
// 3. 无参数有返回值
int (^getNumber)(void) = ^(void){
return 10;
};
// 4. 有参数有返回值
int (^sum)(int, int) = ^(int a, int b) {
return a + b;
};
# __block
如果要在 block 内部修改在 block 外面定义的变量,需在定义该变量时添加 __block
修饰符(两个下划线),如下所示:
__block int a = 10;
void(^block)(void) = ^(){
a = 20;
};
block();
NSLog(@"%d", a);
# 使用 typedef
// 定义block类型
typedef void(^block) (int, int);
// 定义block变量并赋值
block sum = ^(int a, int b) {
NSLog(@"%d", a + b);
};
// 调用block
sum(10, 10);
# Block 回调
定义一个 Tools 的类,声明如下方法:
- (void)sumWith:(int)a b:(int)b callback:(void(^)(int res))callback;
实现 Tools 方法:
- (void)sumWith:(int)a b:(int)b callback:(void (^)(int))callback {
callback(a + b);
}
main 函数中调用:
[[Tools new] sumWith:10 b:10 callback:^(int res) {
NSLog(@"%d", res);
}];