我正在开发一款应用程序,它每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()
现在声音不响了