嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下。
C的回调函数:
callBack.h
1)、定义一个回调函数的参数数量、类型。
typedef void (*CallBack)(int data_i32);
2)、声明一个外部函数指针。
extern CallBack myCallBackPTR;
3)、声明一个doSomeThingCount函数
void DSTCount(void);
callBack.c
1)、定义一个函数指针
CallBack myCallBackPTR;
2、在doSomeThingCount函数,对运行次数自增,并调用函数指针
void DSTCount(void) { static int numb = 0; numb++; (*myCallBackPTR)(numb); }
main.c
1)、定义一个customdoSomeThingCount函数,打印数据
void customDSTCount(int data_i32) { printf("%d\n",data_i32); }
2)、main函数里,把callBack.h的函数指针指向main的 customDSTCount,运行 callBack.h 的 DSTCount 函数
myCallBackPTR = customDSTCount; while (1) { DSTCount(); }
优点:1、不用修改callBack的文件,通过main或其他文件就可以对callBack文件进行修改、补充。
用途:1、如,一个温度传感器外设.c,.h都写好了,不想别人修改它,设成只读,通过设置回调函数指针,根据需要设置滤波方式,或权值滤波、或平均值滤波。
补充:1、回调函数在UCOS里,好像叫钩子(hooks)函数,是不是完全等同,后续再补充吧。
OC的Block:
MyButton.h(继承于UIButton):
1)、定义一个Block的参数数量、类型。(基本相似,c是*,oc是^)
typedef void(^ButtonBlock)(int data_i32);
2)、声明、定义一个Block变量。(基本相似)
@property (nonatomic,strong) ButtonBlock myButtonBlockPTR;
3)、声明一个doSomeThingCount函数。(基本相似)
-(void)DSTCount;
MyButton.m(继承于UIButton):
1)、在doSomeThingCount函数,对运行次数自增,并调用Block变量。(基本相似,C是(*xx)(yy),OC是xx(yy) )
-(void)DSTCount { static int numb = 0; numb++; _myButtonBlockPTR(numb); }
RootViewControl.m(self.window.rootViewController):
1)、viewDidLoad函数,定义一个(100,100,100,100)、红色的按钮实例,按钮的Block里编写,打印次数,按钮添加事件,把按钮加到self.view上
MyButton *tempButton = [[MyButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; tempButton.backgroundColor = [UIColor redColor]; tempButton.myButtonBlockPTR = ^(int data_i32){ printf("%d\n",data_i32); }; [tempButton addTarget:self action:@selector(mybuttonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:tempButton];
2、按钮点击调用,调用MyButton里的DSTCount函数
-(void)mybuttonClick:(MyButton*)button { [button DSTCount]; }
对比:Block的实现,在设置变量时,在括号内编写,不是指向函数。
C的回调函数,只是指针,得指向函数。
补充:仅与C的回调函数对比,Block用处更广。
图片补充:
C回调函数:
1)、CallBack.C
2)、CallBack.h
3)、main.c
OC的Block
1)、MyButton.h
2)、MyButton.m
3)、RootViewControl.m
4)、运行