在 iOS13 中重新分配 AVAudioPlayer 实例会导致 BAD_ACCESS 运行时错误

Re-Assigning instance of AVAudioPlayer in iOS13 leads to BAD_ACCESS runtime error

我有一个应用程序,它在 AppStore 中运行了很多年并且运行时没有任何崩溃(上次部署目标 iOS 12.4)。我有一些代码可以在应用程序中的某些事件上播放声音。

现在我尝试为 iOS 13 升级我的应用程序,并且在不更改与“playSound”相关的任何代码的情况下,我总是遇到此 运行时错误,当在 真实设备 上进行测试。在 模拟器.

上不会发生

线程 1:EXC_BAD_ACCESS(代码=1,地址=0x48)

:在您将该问题标记为“重复”之前,请考虑这一定与[的发布有关=50=]13,因为在它没有发生之前,代码只是“普通”。

这是我的代码,也在 gitHub.

我的 ViewController 中有一个 属性 以防止 ARC 重新分配我的 AVAudioPlayer:

private var mySoundPlayer: AVAudioPlayer = AVAudioPlayer()

我有一个例程,应该执行“播放声音”(这里发生错误,当分配 AVAudioPlayer 的新实例时。resourceURL 不是问题, RE-ASSIGNING 是问题所在,我用一个未分配的新实例对其进行了测试,但我没有崩溃。

// -------------------------------------------------
// 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)
}

我认为由于 async 线程,它无法正常工作。但是因为它在主线程上,我认为这应该可以。

只需删除初始化即可

private var mySoundPlayer: AVAudioPlayer!

干杯!!!

private var mySoundPlayer: AVAudioPlayer = AVAudioPlayer()

AVAudioPlayer 没有将 init() 列为有效的初始值设定项。 reference page 显示了四个独立的初始化器,所有初始化器都至少接受一个参数。如果您在 iOS 13.1 之前的代码中使用上面的行而没有崩溃,则说明您没有正确初始化音频播放器,可能只是幸运这不是问题。

我不知道 AVAudioPlayer 在 iOS 13.1 中具体发生了什么变化,但是 release notes 显示了很多与音频相关的变化,而且似乎有些变化为此 class 引入了对初始化时发生的事情的依赖。