每次新分配后,AVAudioPlayer都不会卸载缓存内存

时间:2010-05-03 04:08:27

标签: iphone objective-c avaudioplayer audiotoolbox

我在Instruments中看到,当我通过Apple提供的标准“AddMusic”示例方法播放声音时,它通过prepareToPlay调用(引用AudioToolBox框架的{{Cache_DataSource::ReadBytes调用来分配32kb的内存。 {1}}功能)每次分配一个新的播放器(即每次播放不同的声音)。但是,缓存的数据永远不会被释放。

如果它没有被释放并且你有很多声音文件要播放,这显然会带来一个巨大的问题,因为如果你有足够的独特声音文件(我不幸的话,它会继续分配内存并最终崩溃)

你们中的任何一个人在我的代码中遇到过这个问题或者我做错了什么?我已经有这个问题了一段时间了,因为我的代码是逐字逐句的(我认为),所以它真的让我烦恼。

我如何调用该函数:

- (void)playOnce:(NSString *)aSound {

// Gets the file system path to the sound to play.
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];  

// Converts the sound's file path to an NSURL object
NSURL *soundURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
self.soundFileURL = soundURL;
[soundURL release];

AVAudioPlayer * newAudio=[[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error:nil];  
self.theAudio = newAudio; // automatically retain audio and dealloc old file if new m4a file is loaded

[newAudio release]; // release the audio safely

// this is where the prior cached data never gets released
[theAudio prepareToPlay];

// set it up and play
[theAudio setNumberOfLoops:0];
[theAudio setVolume: volumeLevel];
[theAudio setDelegate: self];
[theAudio play];

}

然后theAudio当然会在dealloc方法中发布。

1 个答案:

答案 0 :(得分:2)

来自另一个名为smasher的消息来源:

  

AVAudioPlayer每个声音都需要一个单独的播放器;没有选择。从播放器中释放内存的唯一方法是在播放完毕后正确释放。只是叫“停止”让玩家保持活着,这样你就可以再玩一次,并且不会释放任何记忆。

     

OpenAL有类似的问题,你为每个文件加载声音;加上我见过的最常见的实现,一次加载整个文件,内存很难。

     

您可能应该在播放器停止播放时,或者在您选择新声音时,或者在创建新声音的播放器之前释放播放器。