如何在C语言函数中使用self调用OC的方法

如题,昨天在做音效播放,顺便吧音效播放的代码记录一下,音效播放的代码如下:
- (void)playSoundEffect:(NSString *)name {   AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof (audioRouteOverride), &audioRouteOverride);
    //获取音效文件路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
    //创建音效文件URL
    NSURL *fileUrl = [NSURL URLWithString:filePath];
    //音效声音的唯一标示ID
    SystemSoundID soundID = 0;
    //将音效加入到系统音效服务中,NSURL需要桥接成CFURLRef,会返回一个长整形ID,用来做音效的唯一标示
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)(fileUrl), &soundID);
    //设置音效播放完成后的回调C语言函数
    AudioServicesAddSystemSoundCompletion(soundID,NULL,NULL,soundCompleteCallBack,NULL);

    //开始播放音效
    AudioServicesPlaySystemSound(soundID);
}
#pragma mark -音频播放代理-
/* 音效播放完成的回调函数,这个是C语言函数,第一个参数是音效ID,第二个是万能参数 */
void soundCompleteCallBack(SystemSoundID soundID, void *clientData)
{
    NSLog(@"播放完成");
    [object jumpToRobotVc];
    
}
如上在上面音效播放回调的函数里面我需要使用self调用OC的方法 跳转控制器的操作,但是我发现直接使用self是不行的 因为在C语言中是不是别self这个OC的关键字的 细心的你肯定也已经发现 我在上面的c语言函数中使用的是object来调用的 ,好吧 我就不兜圈子了 其实在C语言函数中 使用对象或者是类去调用OC的方法是完全没有问题的 但是我需要的是self来调用 但是c语言又不识别self关键字 那我该怎么办呢 想了很久 终于想到了一个方法 ,既然不能识别self关键字 那我就用另外一个对象来记录self,没错 就是使用一个id object来记录它,我们可以这么做 声明一个全局的属性 或者是一个静态变量
static id object;

然后在viewDidload中 记录下这个self

- (void)viewDidLoad {
    [super viewDidLoad];
    object = self;

下面你就可以愉快的使用objcet这个对象去做你想做的事情了,最后在使用完成后记得将object 置为nil

你可能感兴趣的:(如何在C语言函数中使用self调用OC的方法)