C 函數指針 在OC中應用

**

運用場景:一些使用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作爲信息傳輸的媒介。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章