Повторное назначение экземпляра AVAudioPlayer в iOS13 приводит к ошибке времени выполнения BAD_ACCESS - PullRequest
4 голосов
/ 30 сентября 2019

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

У меня есть приложение, которое много лет находится в AppStore и работает без сбоев (последняя цель развертывания iOS 12.4). У меня есть некоторый код для воспроизведения звука в определенных событиях в приложении.

Теперь я попытался обновить свое приложение для iOS 13, и без изменения кода, связанного с этой функцией playSound, я всегда получаю это ошибка времени выполнения при тестировании на реальном устройстве . Не происходит на симуляторе .

Тема 1: EXC_BAD_ACCESS (код = 1, адрес = 0x48) Shows the error message

ПОЖАЛУЙСТА: Прежде чем пометить этот вопрос как «дублировать» , подумайте, что это должно быть как-то связано с выпуском iOS13, потому что до этого этого не происходило и код просто «обычный».

Вот мой код, также на gitHub .

У меня есть свойство в моем ViewController для предотвращения освобождения ARC моего AVAudioPlayer:

private var mySoundPlayer: AVAudioPlayer = AVAudioPlayer()

У меня есть подпрограмма, в которой должно быть выполнено «воспроизведение звука» (здесь происходит ошибка, когда назначает новый экземпляр AVAudioPlayer. ResourceURL не является проблемой, повторное назначение является проблемой, япротестировал его с новым экземпляром, который не был назначен, и я не потерпел крах.

// -------------------------------------------------
// MARK: Private Methods
// -------------------------------------------------

private func makeSoundEvent(_ soundEvent : SoundEvent) {

    guard Settings().getSound() == .soundON else { return }
    guard let urlToRessource : URL = soundEvent.getFileURLToSoundRessource() else { return }
    do {
        mySoundPlayer = try AVAudioPlayer(contentsOf: urlToRessource)
        try? AVAudioSession.sharedInstance().setActive(true)
        mySoundPlayer.play()
    }
    catch { print("Could not create AVPlayer for ressource \(urlToRessource)") }
}

И здесь у меня есть вызов этой подпрограммы, где-то в моей viewDidLoad () с задержкой в ​​2 секунды.

DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
    self.makeSoundEvent(.startFanfare)
}

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

СПАСИБО за любой совет!

Ответы [ 2 ]

4 голосов
/ 30 сентября 2019

Просто удалите инициализацию, и она будет работать

private var mySoundPlayer: AVAudioPlayer!

Ура !!!

1 голос
/ 02 октября 2019

private var mySoundPlayer: AVAudioPlayer = AVAudioPlayer()

AVAudioPlayer не содержит init() в качестве действительного инициализатора. На справочной странице показаны четыре отдельных инициализатора, каждый из которых принимает хотя бы один параметр. Если вы использовали строку выше в коде до iOS 13.1 без сбоев, вы неправильно инициализировали аудиоплеер и, возможно, просто повезло, что это не было проблемой.

Я не знаю, что конкретно изменилосьс AVAudioPlayer в iOS 13.1, но примечания к выпуску показывают довольно много изменений, связанных со звуком, и кажется вероятным, что некоторые изменения в этом классе привели к зависимости от того, что происходит во время инициализации.

...