iOS 5 AVAudioPlayer - Как правильно остановить воспроизведение при включенном ARC?

Я использую iOS 5 с включенным ARC. Я проигрываю запись, связанную с определенным видом, при нажатии на него. Когда пользователь меняет представление, воспроизведение останавливается. Я использовал NSNotification для вызова метода -stopPlayback, который отлично работает. Проблема в том, что когда пользователь возвращается к исходному виду и нажимает на него, он продолжается с того места, где была остановлена ​​запись.

С отключенным ARC я мог бы использовать следующий код:

-stopPlayback
{
 if([audioPlayer isPlaying])
 {
 [audioPlayer stop];
 [audioPlayer release];
 audioPlayer = nil;
 }
}

Поскольку ARC не позволяет [выпуск audioPlayer], я не могу сбросить воспроизведение с самого начала. Я удалил [выпуск audioPlayer] и audioPlayer = nil; так как ARC обработает это, и в результате запись будет воспроизводиться с того места, где она была остановлена ​​после предыдущей остановки. Я не вижу хороших примеров или документации от Apple о том, как перезапустить запись с самого начала при воспроизведении. Как лучше всего продолжить?


person J1NX3D    schedule 09.11.2011    source источник


Ответы (2)


Вам по-прежнему нужна настройка nil:

if([audioPlayer isPlaying])
{
    [audioPlayer stop];
    audioPlayer = nil;
}
person DarkDust    schedule 09.11.2011
comment
Спасибо. Я обновил это в своем коде. Как насчет перезапуска воспроизведения с самого начала? - person J1NX3D; 09.11.2011
comment
А как насчет currentTime? Если я добавлю audioPlayer.currentTime = 0; это перезапустит воспроизведение с самого начала? - person J1NX3D; 09.11.2011
comment
Если все, что вам нужно, это перезапуск плеера, вам не нужно его отпускать. См. этот вопрос. - person DarkDust; 10.11.2011

Это решение, которое я придумал:

-stopPlayback{  
 if([audioPlayer isPlaying])
 {
   [audioPlayer stop];
   audioPlayer.currentTime=0;
 }
}

Теперь запись воспроизводится с самого начала, независимо от того, когда она была остановлена. Я попытался использовать [audioPlayer pause] вместо [audioPlayer stop], из-за чего воспроизведение не воспроизводилось снова после начальной паузы. То же самое произошло, когда я добавил audioPlayer = nil; (хотя я не документировал точную комбинацию). Связанный вопрос, опубликованный как часть ответа, действительно использовал currentTime = 0, но остальная часть кода не соответствовала моим потребностям. Кто-нибудь может понять, почему это не сработает? Любые дальнейшие комментарии приветствуются.

person J1NX3D    schedule 10.11.2011