0

我想知道如何在这个通过缓冲区播放文件然后停止它的简单程序中释放内存。

-(void)setupAudioOne  
{  
NSError *error;  
BOOL success = NO;  

_player = [[AVAudioPlayerNode alloc] init];  

NSURL *hiphopOneURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Hip Hop 1" ofType:@"caf"]];  
AVAudioFile *hiphopOneFile = [[AVAudioFile alloc] initForReading:hiphopOneURL error:&error];  
_playerLoopBuffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:[hiphopOneFile processingFormat] frameCapacity:(AVAudioFrameCount)[hiphopOneFile length]];  
success = [hiphopOneFile readIntoBuffer:_playerLoopBuffer error:&error];  

_engine = [[AVAudioEngine alloc] init];  
[_engine attachNode:_player];  

AVAudioMixerNode *mainMixer = [_engine mainMixerNode];  

AVAudioFormat *stereoFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100 channels:2];  

[_engine connect:_player to:mainMixer fromBus:0 toBus:0 format:stereoFormat];  

[self startEngine];  
}  

以上是引擎和播放器节点的一般设置。然后我们用播放按钮实现播放器:

- (IBAction)play:(id)sender {  
if (!self.playerIsPlaying)  
{  
    [self setupAudioOne];  
    [_player scheduleBuffer:_playerLoopBuffer atTime:nil options:AVAudioPlayerNodeBufferLoops completionHandler:nil];  
    [_player play];  
}  
}

最后我们用停止按钮停止播放器:

- (IBAction)stopHipHopOne:(id)sender {  

if (self.playerIsPlaying) {  
    [_player stop];  
} 

playerIsPlaying 只是一个简单的 BOOL,用于确定 _player 是否正在播放。

所以基本上我的问题是,当你现在编写这个程序时按下停止按钮时,不会释放任何内存。当然,我可以将一行简单的代码添加到停止按钮中,以释放引擎和播放器正在使用的内存?

有什么想法吗?

4

1 回答 1

2

就在这里。停止播放器节点后,您可以调用:

[_engine disconnectNodeInput:_player];
[_engine detachNode:_player];

我看到您还保留了对音频缓冲区的引用,因此您可能也想要nil那个。如果这对你不起作用,请告诉我。其他东西可能正在泄漏。

于 2016-06-14T23:18:48.527 回答