學了OC的block,再寫C的回調函數有點彆扭,對比下區別,回憶記錄下。 C的回調函數: callBack.h 1)、定義一個回調函數的參數數量、類型。 2)、聲明一個外部函數指針。 3)、聲明一個doSomeThingCount函數 callBack.c 1)、定義一個函數指針 2、在doSome ...
學了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)、運行