Я вижу в Instruments, что когда я воспроизводю звук с помощью стандартного метода-примера «AddMusic», который предоставляет Apple, он выделяет 32 КБ памяти с помощью вызова prepareToPlay
(который ссылается на функцию Cache_DataSource::ReadBytes
* * * *) * * * * каждый раз, когда назначается новый игрок (то есть каждый раз, когда воспроизводится другой звук). Однако эти кэшированные данные никогда не публикуются.
Это, очевидно, создает огромную проблему, если он не выпущен, и у вас есть много звуковых файлов для воспроизведения, так как он имеет тенденцию продолжать выделять память и в конечном итоге падает, если у вас достаточно уникальных звуковых файлов (что, к сожалению, я делаю) .
Кто-нибудь из вас сталкивался с этим или что я не так делаю в своем коде? У меня была эта проблема некоторое время, и это действительно беспокоит меня, так как мой код дословно того, что Apple (я думаю).
Как я вызываю функцию:
- (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
.