PSA: [[AVAudioPlayer alloc] init] вылетает в iOS 13.1+ (и AVAudioPlayer ()) - PullRequest
0 голосов
/ 01 октября 2019

В одном из наших приложений используется класс 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.

...