освобождение объекта перед обратным вызовом audioPlayerDidFinishPlaying - PullRequest
2 голосов
/ 27 сентября 2010

Встретьтесь с интересной проблемой и не знаете, как с ней справиться.

Каков наилучший способ обработки метода обратного вызова AVAudioPlayer, audioPlayerDidFinishPlaying, если, например, экземпляр AVAudioPlayer создается с обратным вызовом, когда аудио завершено, но объект, содержащий AVAudioPlayer (и обратный вызов), освобожден до окончания аудио?

Это моя текущая ситуация, когда приложение постоянно аварийно завершает работу, когда пытается вызвать уже не существующий метод обратного вызова.

Подумав об этом, ответ, вероятно, будет актуален для всех групп обратных вызовов. Должен быть какой-то способ уничтожить или отменить методы обратного вызова.

1 Ответ

0 голосов
/ 27 сентября 2010

Вы должны отслеживать все, что вы зарегистрировали для «обратных вызовов», и отменить их в -dealloc, например,

-(void)dealloc
{
  // If you've registered for notifications, do something like this:
  [[NSNotificationCenter defaultCenter] removeObserver:self];

  // If you're the delegate of something, do something like this:
  self.audioPlayer.delegate = nil;
  self.audioPlayer = nil;

  [super dealloc];
}

Не существует магического метода, который ищет все, что когда-либо для любого указателя, который выглядит так, как будто это указатель на вас и обнуляет его. Есть много проблем с этим подходом (не ограничиваясь тем, чтобы быть slooooow ...).

...