嵌入式&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)、運行