AudioServicesAddSystemSoundCompletion: как использовать параметр void*?

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

Я использую 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*. Что это значит?

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

Вы можете помочь мне?

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


person reinaldoluckman    schedule 08.09.2010    source источник


Ответы (1)


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

person hotpaw2    schedule 08.09.2010
comment
Пустота* — это просто заполнитель для указателя на произвольный тип, например. ничего, так как подпрограмма не знает и не ограничивает, какой тип данных (объект, массив, словарь, структура, int, float, frog и т. д.) вы хотите передать. - person hotpaw2; 09.09.2010
comment
NSArray arrayWithObjects возвращает массив автоосвобождения. Я думаю проблема не в этом. - person reinaldoluckman; 09.09.2010
comment
Объект autorelease нигде не сохраняется (если только вы не сохраните его или не передадите его чему-то, что его сохраняет). Таким образом, непригодным для использования. - person hotpaw2; 09.09.2010
comment
Ты прав. Мне пришлось передать аргумент с [копией данных] и освободить его в функции обратного вызова. Большое спасибо. - person reinaldoluckman; 09.09.2010