回调的概念在面向对象的语言中用的很广泛,如Java中的接口、objective-c中的delegate和block。相对正常的函数调用,如A调B,在B执行完后会有返回值给A,回调通常没有返回值,而是B中被调用函数执行到某个步骤后,调用A中的某个方法,并传递相应的参数。 在C语言中,虽然没有对象的概念,但控制函数的运行逻辑,也可以使用回调。
函数指针定义的形式:返回值类型 (*指针变量名)(形参1,形参2)
typedef void (*sayInt)(int val);
void realSay(int val){
printf("%d", val);
}
void nowSay(int value, sayInt aFun){
aFun(value);
}
具体的调用
nowSay(5, realSay); //结果:5
对比这种形式,发现objective-c的block和C的函数指针回调很相似。
typedef void(^blockSay)(int val);
- (void)bNowSay:(int)value completion:(blockSay)sBlock{
sBlock(value);
}
实际的调用
[self bNowSay:5 completion:^(int val){
NSLog(@"%d", val); //结果5,相当于C语言中的realSay()
}];