ios - AVAudioPlayer 导致应用程序崩溃
问题描述
我正在开发一个应用程序,该应用程序每 200 毫秒接收一个整数,并将在接下来的 200 毫秒间隔内均匀分布整数的大小。声音工作正常,但应用程序在完全随机的时间崩溃。我最初是在 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
)?并且在 player 变量中 is "ObjectiveC.NSObject"
which 本身是空的
真的不太确定还能尝试什么,因为我尝试让 player 成为一个弱变量,但随后音调不起作用。我试过在视图控制器中定义它。这也让我感到困惑,为什么它似乎没有在 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()
现在声音不播放了
解决方案
最有可能发生崩溃是因为audioPlayer
在声音结束之前发布了。为防止这种情况,正如您在评论中所写,您可以在调用之前检查播放器是否正在播放声音playSound
。或者将每个存储player
在数组中,然后在声音结束时释放。
推荐阅读
- javascript - 使用 nock 从针返回可读模拟 - twitter 过滤流测试
- python-3.x - 在函数中,for循环错过了列表中的一项
- csrf - 为 Blazor UI 应用程序实施防伪验证
- javascript - 如何将文本每隔一行拆分?
- r - 在 r 中加载 .text 数据并希望数字显示与原始文本文件完全相同
- python-3.x - 独角兽蟒克莱因
- mysql - 如何计算 PostgreSQL 中列的每个不同值的出现次数?
- javascript - 遍历对象数组并使用迭代值创建一个新对象
- awk - AWK 加入下一行而不删除它
- python - Openpyxl - 在 for 循环中向列(或列范围)添加数据验证