**
运用场景:一些使用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作为信息传输的媒介。