Я работаю над приложением, которое получает целое число каждые 200 мс и воспроизводит тон для размера целого числа, равномерно распределенного в течение следующего интервала 200 мс.Звук работает нормально, но приложение вылетает в совершенно случайное время.Первоначально я проводил тестирование на iPod (5-го поколения), и он зависал где-то между 1 и 10 минутами, давая мне сообщение об ошибке
"EXC_BREAKPOINT (EXC_ARM_BREAKPOINT, subcode = 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 находится "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()
и теперь звук не воспроизводится