AVAudioNode创建后立即释放,无法附加到AVAudioEngine求助
问题分析与解决办法
AVAudioNode是抽象基类,不能直接实例化,你直接创建AVAudioNode()实例会导致对象处于非法未初始化状态,这就是为什么它会被立即释放、调用print或attach时崩溃,控制台po AVAudioNode()返回<uninitialized>的原因。- 而
AVAudioMixerNode()能正常工作,是因为它是AVAudioNode的合法具体子类,苹果设计这类节点时只允许通过子类创建实例。 - 修复代码很简单,把直接实例化
AVAudioNode的代码替换成你需要的具体子类(比如混音节点、播放器节点、效果器节点等),示例如下:
class MyClass { // 替换为具体的AVAudioNode子类,这里以AVAudioMixerNode为例 let node = AVAudioMixerNode() let engine = AVAudioEngine() func foo() { print(node) // 不再崩溃 engine.attach(node) // 正常执行 } }
- 注意:根据你的实际业务需求选择对应的子类,比如播放音频用
AVAudioPlayerNode,添加音效用AVAudioUnitEffect的子类,混音用AVAudioMixerNode等,所有可用的音频节点都是AVAudioNode的子类,不要直接使用基类。
内容的提问来源于stack exchange,提问作者Kakhi Kiknadze
相关产品推荐
相关产品推荐

