我正在开发一个每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()
现在声音无法播放
答案 0 :(得分:1)
最有可能发生崩溃,因为audioPlayer
在声音结束之前被释放。为了防止这种情况,正如您在评论中写的那样,您可以在致电playSound
之前检查播放器是否正在播放声音。或者将每个player
存储在数组中,然后在声音结束时释放。