我创建了一个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];
}
答案 0 :(得分:2)
我解决了这个问题,但我不完全确定为什么我的解决方案解决了它。在查看Leaks
工具后,我注意到_sampler
变量的保留计数为2.该类(您看不到称为MIDIController
的对象拥有_sampler
对象。 _engine
对象也保留了对采样器的引用。即使我将midi控制器对象设为nil,采样器仍保留在内存中,保留计数为1.奇怪的是,不再有任何引用_engine
对象,因为它的父级已被解除分配,所以我不确定为什么它仍然存在。
TLDR:简而言之,我做了_sampler
,_engine
和_mixer
nil,这解决了它。