AudioServicesAddSystemSoundCompletion: как использовать параметр void *? - PullRequest
1 голос
/ 09 сентября 2010

Я хочу воспроизвести два звука, но последний только после первого конца.

Я использую 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, так что извините, если это глупый вопрос.Кастинг работает нормально, но когда я пытаюсь получить доступ к первой позиции, происходит плохое выполнение.Я действительно не понимаю, почему void * type.Что это значит?

В этом другом посте парень передает UIButton без каких-либо кастингов, и эта идея мне тоже не сработала.

Можете ли вы помочь мне?

Заранее спасибо.

1 Ответ

2 голосов
/ 09 сентября 2010

Вам нужно сохранить свой NSArray где-то перед тем, как передать его в вашу процедуру завершения как void *. ОС не может этого сделать, потому что она даже не знает, является ли void * объектом или нет.

...