**
運用場景:一些使用C/C++寫的SDK中,有時候會要求傳入一個函數指針,底層調用這個函數指針指向的函數來達到傳參的目的。
**
1.底層SDK中的一段代碼
//定義函數指針類型:int(*)(const int, const int, const int)
typedef int (*VideoCallBack)(const int msg1, const int msg2, const int msg3);
-(void)setVideoCallBack:(VideoCallBack)cblock;
//調用傳入的函數指針指向的函數,向這個函數傳入三個int類型數據
int resultInt = cblock(200, 200, 200);
2.在OC中設置這個函數指針:
//設置函數指針
[sdkNAME setVideoCallBack:ccFunction];
//在OC中寫一個int(*)(const int, const int, const int)類型的C函數
int ccFunction(const int para1, const int para2, const int para3){
int sum = para1 + para2 + para3;
NSLog(@"收到的三個參數總和:%d", run);
NSString *message = [NSString stringWithFormat:@"%d", run];
//存起來,因爲c函數中不能訪問到OC的實例
NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];
[userdefaults setObject:message forKey:@"C_MESSAGE"];
[userdefaults synchronize];
//發送廣播給MSG接收者
[[NSNotificationCenter defaultCenter] postNotificationName:@"CMSG" object:nil userInfo:nil];
//返回一個int到SDK中
return run;
}
3.通過廣播接收者來爲OC實例設置參數
//註冊廣播接收
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction) name:@"CMSG" object:nil];
- (void)notificationAction{
NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];
NSString *message = [userdefaults objectForKey:@"C_MESSAGE"];
NSLog(@"++++ %@ ++++", message);
self.titleView.text = message;
}
總結:c代碼快中不能訪問當前已經實例化OC的實例,但是可以訪問靜態類方法,所以這裏我用了NSUserDefaults 和 NSNotificationCenter作爲信息傳輸的媒介。