В одном из наших приложений используется класс AudioManager, который обрабатывает воспроизведение различных аудиофайлов и создает два экземпляра AVAudioPlayer при инициализации. Многие из наших методов работают в предположении, что эти два экземпляра никогда не будут равны нулю, поэтому мы используем универсальный метод init
для создания этих двух экземпляров при инициализации синглтона класса менеджера, например:
- (id)init
{
self = [super init];
if(self){
_pushPlayer = [[AVAudioPlayer alloc] init];
_queuePlayer = [[AVAudioPlayer alloc] init];
}
return self;
}
Это лучший способ сделать это? Наверное, нет, но это не главное. Дело в том, что 13.1 имеет некоторую ошибку в том, как распределяются / освобождаются AVAudioPlayers. Если вы создадите AVAudioPlayer таким образом, ваше приложение вылетит , когда оно попытается освободить его. Вы получите EXC_BAD_ACCESS
для указателя вашего аудиоплеера.
Далее, попытка изменить фиктивный проигрыватель, например, установить делегата (даже на ноль), приведет к аналогичному падению.
Наше приложение прекрасно работает на устройствах с iOS 13.0 и более ранних версий. Мы установили приложение из App Store на устройствах с несколькими версиями, и оно зависало только на устройствах с 13.1.
. Я также заметил, что метод init
отсутствует в официальной документации для * 1033. * AVAudioPlayer , хотя этот метод не считается устаревшим и при его использовании не выдается никаких предупреждений.
Не используйте [[AVAudioPlayer alloc] init]
или AVAudioPlayer()
для тех из вас, ктоиспользуйте Swift.