AudioServicesAddSystemSoundCompletion:如何使用void *参数?

时间:2010-09-08 22:51:00

标签: iphone objective-c core-audio

我想播放两个声音,但最后一个声音仅在第一个结束后播放。

我正在使用AudioServicesAddSystemSoundCompletion:

  NSArray  *data      = [NSArray arrayWithObjects:target, callback, nil]; 
  NSString *soundPath = [bundle pathForResource:sound ofType:type];

  SystemSoundID soundID;
  AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath: soundPath], &soundID);
  AudioServicesAddSystemSoundCompletion(soundID, NULL, NULL, playSoundFinished, data);

  AudioServicesPlaySystemSound(soundID);

和我的playSoundFinished方法:

static void playSoundFinished(SystemSoundID soundID, void *data) {

    NSArray *data_ = (NSArray *)data;
 id  obj    = [data_ objectAtIndex:0];
 SEL method = NSSelectorFromString([data_ objectAtIndex:1]);

 [obj performSelector:method];

}

文档统计信息,最后一个参数必须是void*,并且它是在回调方法中工作的数据,但是如何使用我传递的NSArray作为参数?我是C和Objective-C的新手,很抱歉,如果这是一个愚蠢的问题。转换工作正常,但是当我尝试访问第一个位置时,会发生错误的执行。我真的不明白为什么无效*类型。这意味着什么?

在这个other post中,这个家伙在没有任何演员的情况下传递了UIButton,这个想法对我来说也不起作用。

你能帮助我吗?

提前致谢。

1 个答案:

答案 0 :(得分:2)

在将NSArray作为void *传递给完成例程之前,您需要将其保留在某处。操作系统不能这样做,因为它甚至不知道void *是否是一个对象。