AVAudioPlayer导致应用崩溃

时间:2018-05-18 20:48:52

标签: ios swift xcode avplayer avaudioplayer

我正在开发一个每200MS接收一个整数的应用程序,并将播放在整个下一个200MS间隔内均匀分布的整数大小的音调。声音工作正常,但应用程序完全随机崩溃。我最初在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)?并且在玩家变量中"ObjectiveC.NSObject"本身是空的

真的不太确定还有什么可以尝试,因为我试图让玩家变弱,但是后来的音调并没有发挥。我试过在视图控制器中定义它。它也让我感到困惑的是为什么它似乎没有在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()

现在声音无法播放

1 个答案:

答案 0 :(得分:1)

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