Storyboard Segue导致AVAudioEngine崩溃问题求助
解决AVAudioEngine Segue跳转崩溃问题(outputNode断言失败)
嘿,我来帮你搞定这个崩溃问题!你遇到的required condition is false: outputNode错误,本质是视图控制器销毁时,AVAudioEngine相关的资源没有被正确清理,导致引擎内部的状态异常。结合你的代码,我给你几个具体的修复步骤:
一、彻底清理视图消失时的音频资源
你之前只在viewWillDisappear里停了引擎和sequencer,但这远远不够。我们需要把所有和引擎绑定的资源都解除关联,还要停用音频会话。修改你的viewWillDisappear方法:
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) // 1. 停止并销毁sequencer,断开和引擎的强引用 if let seq = sequencer { seq.stop() sequencer = nil } // 2. 停止引擎、移除采样器、重置引擎状态 if engine.isRunning { engine.stop() } engine.detach(sampler) engine.reset() // 3. 停用音频会话,释放系统音频资源 let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setActive(false, options: .notifyOthersOnDeactivation) } catch { print("停用音频会话失败: \(error)") } }
二、修复重复初始化的问题
你在viewDidLoad里重新初始化了engine和sampler,但类属性已经声明并初始化了这些对象。这会导致旧的引擎实例被丢弃,资源无法正常释放。把viewDidLoad里的这两行删掉:
// 删掉这两行! engine = AVAudioEngine() sampler = AVAudioUnitSampler()
三、确保sequencer的生命周期和视图控制器绑定
在setupSequencer里,你通过AVAudioSequencer(audioEngine: engine)把sequencer和引擎绑定了,所以在视图销毁时必须把sequencer置为nil,这样才能打破它们之间的强引用链,让引擎能被正确释放。
为什么之前的show Segue正常?
因为show Segue是push新的视图控制器,当前的PlayerViewController还留在导航栈里,没有被销毁,所以引擎资源还在内存里,不会触发崩溃。而unwind和导航栏返回是销毁当前视图控制器,这时候如果资源没清理干净,就会触发引擎内部的断言检查失败。
做完这些修改后,再测试导航栏返回和unwind Segue,应该就能正常工作了!
内容的提问来源于stack exchange,提问作者Terry B
相关产品推荐
相关产品推荐

