You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:48:35