AVAudioPlayer 导致应用程序崩溃

AVAudioPlayer causing app to crash

我正在开发一个应用程序,它每 200 毫秒接收一个整数,并会在接下来的 200 毫秒间隔内根据整数的大小均匀地播放一个音调。声音正常,但应用程序在完全 运行dom 时间崩溃。我最初是在 ipod(第 5 代)上进行测试,它在 1 分钟到 10 分钟之间的任何时间崩溃给我错误

"EXC_BREAKPOINT (EXC_ARM_BREAKPOINT, subcode=0xdefe)"

在我得到 EXC_BAD_ACCESS 之前,但在将播放器定义移至 AppDelegate 以及其他尝试修复之后,消息现在是 ARM 断点消息。我还尝试了我的 iPhone 6S+,它 运行 超过 15 分钟没有崩溃。

播放器在 ViewController 中定义(如此处另一个 post 所建议),如下所示:

var audioPlayer: AVAudioPlayer!

下面是视图控制器 class 中用于播放音调的代码:

//called for every beep
@objc func playSound() {
    toneCount += 1
    if toneCount >= totalTones{
        if toneTimer != nil {
            toneTimer?.invalidate()
            toneTimer = nil
        }
    }
    do{
        guard let url = Bundle.main.url(forResource: "geiger", withExtension: "mp3") else { return }
        audioPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
        audioPlayer.play()
    }catch{
        print("failed")
    }

}

崩溃发生时输出到控制台:

"[AVAudioPlayer performSelector:withObject:]: message sent to deallocated instance 0x1886b590"

在堆栈帧中(不确定这是否正确,但控制台输出左侧的帧)播放器变量显示它等于 (AVAudioPlayer)?在播放器变量中是 "ObjectiveC.NSObject" ,它本身是空的

真的不太确定还能尝试什么,因为我已经尝试让播放器成为一个弱变量,但是音调没有播放。我试过在视图控制器中定义它。这也让我感到困惑,为什么它似乎没有在 iphone 6S+ 上崩溃,以及为什么它完全 运行dom 崩溃发生的时间。

我也试过在一个单独的文件中做一个单例 class 像这样:

let tone = soundtest()

class soundtest {
    func playTone() {
        do{
            print("played Sound")
            guard let url = Bundle.main.url(forResource: "geiger", withExtension: "mp3") else { return }
            let audioPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            try AVAudioSession.sharedInstance().setActive(true)
            audioPlayer.play()
        }catch{
            print("failed")
        }
    }
}

尝试播放这样的音调:

tone.playTone()

现在没有声音了

很可能发生崩溃是因为 audioPlayer 在声音结束之前被释放了。为防止这种情况,正如您在评论中所写,您可以在调用 playSound 之前检查播放器是否正在播放声音。或将每个player存储在数组中,然后在声音结束时释放。