代码之家  ›  专栏  ›  技术社区  ›  Mumphus

AVAudioPlayer导致应用程序崩溃

  •  0
  • Mumphus  · 技术社区  · 6 年前

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

    EXC_断点(EXC_ARM_断点,子代码=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"
    

    在stackframe(不确定这是否是正确的术语,但控制台输出左侧的帧)中,会显示player变量,表明它等于( AVAudioPlayer )? 在player变量中 "ObjectiveC.NSObject" 它本身是空的

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

    我还尝试在单独的文件中创建一个singleton类,如下所示:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Tien Nguyen    6 年前

    很可能是因为 audioPlayer 在声音结束前发布。为了防止这种情况发生,正如你在评论中所写,你可以在打电话之前检查播放器是否在播放声音 playSound .或储存每个 player 在阵列中,然后在声音结束时释放。