1

我创建了一个AVAudioUnitSampler,但是在通过该Instruments工具检查内存之后,似乎当场景发生变化时,即使AVAudioUnitSampler对象为零,它最初加载的资源仍然在内存中。当我重新创建采样器时,它会重新加载资源,现在我有双倍的用于采样器的内存量。如何强制资源解除分配?

这是代码:

-(void) loadSampler {
    // Instatiate audio engine
    _engine = [[AVAudioEngine alloc] init];
    _mixer = [_engine mainMixerNode];
    _sampler = [[AVAudioUnitSampler alloc] init];

    [self loadSoundFontInstrument]; //sound font is the instrument that the sampler will use to play sounds

    [self makeEngineConnections];
    [self startEngine];
}

-(void) loadSoundFontInstrument {
    if (_sampler != nil) {
        NSString* instrument = [[GameData sharedGameData].settings valueForKey:@"instrument"]; //decides on what sound font file to use
        NSURL *piano = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:instrument ofType:@"sf2"]];
        [_sampler loadSoundBankInstrumentAtURL:piano program:0 bankMSB:0x79 bankLSB:0 error:nil];
    }
    else
        NSLog(@"ERROR: Sampler has not been initialized");
}

-(void)makeEngineConnections {
    [_engine attachNode:_sampler];
    [_engine connect:_sampler to:_mixer format:[_sampler outputFormatForBus:0]];
}

-(void)startEngine {
    [_engine startAndReturnError:nil];
}
4

1 回答 1

2

我解决了这个问题,但我不完全确定为什么我的解决方案解决了它。在查看Leaks仪器时,我注意到_sampler变量的保留计数为 2。类(你看不到称为MIDIController拥有该_sampler对象。该_engine对象还保留对采样器的引用。即使我将我的 midi 控制器对象设为 nil,采样器仍然保留在内存中,保留计数为 1。奇怪的是,不再有任何对该_engine对象的引用,因为它的父对象已被释放,所以我不确定它为什么仍然存在。

TLDR:简而言之,我做了_sampler,_engine_mixernil 并解决了它。

于 2015-08-15T06:13:42.963 回答