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

问题描述 投票:3回答:3

嘿家伙,很遗憾,我坚持了下来,并且在最近三天尝试了很多事情之后,我必须在这里要求help

我有一个应用程序,已经在AppStore中使用了很多年,并且运行时没有崩溃(最新部署目标是iOS 12.4)。我有一些用于在应用程序中的某些事件上播放声音的代码。

现在,我尝试为iOS 13升级我的应用程序,并且没有更改与该“ playSound”相关的任何代码,当在真实设备上进行测试时,总是得到此运行时错误。在simulator上不会发生。

线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x48)Shows the error message

PLEASE:在将该问题标记为“ duplicate”之前,请考虑这与iOS13的发布有关,因为在此之前它没有发生,并且代码只是“通常的” “。

这是我的代码,也在gitHub上。

我在ViewController中具有一个属性,以防止ARC取消分配我的AVAudioPlayer:

private var mySoundPlayer: AVAudioPlayer = AVAudioPlayer()

我有一个例程,应该在其中执行“播放声音”(在assigning一个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线程,它以某种方式不起作用。但是由于它在主线程上,所以我认为这应该可行。

感谢您提供任何建议!

ios swift avaudioplayer exc-bad-access
3个回答
2
投票

只需删除初始化,它将起作用

私人var mySoundPlayer:AVAudioPlayer!

干杯!


0
投票

private var mySoundPlayer: AVAudioPlayer = AVAudioPlayer()

AVAudioPlayer没有将init()列为有效的初始化程序。 reference page显示了四个单独的初始化器,所有初始化器都至少带有一个参数。如果您在iOS 13.1之前的代码中使用上面的代码而没有崩溃,则表示您错误地初始化了音频播放器,可能只是很幸运,这不是问题。

[我不知道iOS 13.1中AVAudioPlayer的具体更改是什么,但是release notes显示了很多与音频相关的更改,并且该类的某些更改似乎引入了对发生在初始化时间。


0
投票

我遇到了几乎相同的问题。以前在Xcode12.4中起作用现在不在13.1中。感谢您提供以下帮助代码

导入UIKit导入AVFoundation

class Abdicate Def:UIViewController {

var play abdicatesound= URL(fileURLWithPath: Bundle.main.path(forResource: "abdicatesound", ofType: "wav")!)

var playerabdicate = AVAudioPlayer()

@IBOutlet weak var popupDef: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    popupDef.layer.cornerRadius = 10
    popupDef.layer.masksToBounds = true

 playerabdicate = try! AVAudioPlayer(contentsOf: play, fileTypeHint: nil) Thread 1: EXC_BAD_ACCESS (code=1, address=0x48)
    getting error here 
}
@IBAction func backButton(_ sender: Any) {
    dismiss(animated: true, completion: nil)

}
@IBAction func soundButton(_ sender: Any) {
    player abdicatesound.play()
}

}

© www.soinside.com 2019 - 2024. All rights reserved.