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
存储在数组中,然后在声音结束时释放。
我正在开发一个应用程序,它每 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
存储在数组中,然后在声音结束时释放。