首页 > 解决方案 > AVAudioPlayer 导致应用程序崩溃

问题描述

我正在开发一个应用程序,该应用程序每 200 毫秒接收一个整数,并将在接下来的 200 毫秒间隔内均匀分布整数的大小。声音工作正常,但应用程序在完全随机的时间崩溃。我最初是在 ipod(第 5 代)上进行测试,但它在 1 分钟到 10 分钟之间崩溃,给了我错误

“EXC_BREAKPOINT(EXC_ARM_BREAKPOINT,子代码=0xdefe)”

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

播放器是在 ViewController 中定义的(正如此处的另一篇文章所建议的那样),如下所示:

var audioPlayer: AVAudioPlayer!

这是视图控制器类中用于播放音调的代码:

//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)?并且在 player 变量中 is "ObjectiveC.NSObject"which 本身是空的

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

我也尝试在一个单独的文件中做一个单例类,如下所示:

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()

现在声音不播放了

标签: iosswiftxcodeavplayeravaudioplayer

解决方案


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


推荐阅读