Je vois dans Instruments que lorsque je joue un son via la méthode exemple "AddMusic" fournie par Apple, il alloue 32kb de mémoire via l'appel prepareToPlay
(qui fait référence au framework AudioToolBox
Cache_DataSource::ReadBytes
fonction) à chaque fois qu'un nouveau joueur est attribué (c'est-à-dire chaque fois qu'un son différent est joué). Cependant, les données mises en cache ne sont jamais libérées. Cela pose évidemment un énorme problème si elle ne se libère pas et que vous avez beaucoup de fichiers audio à jouer, car elle a tendance à continuer à allouer de la mémoire et éventuellement se bloque si vous avez assez de fichiers audio uniques (que je fais malheureusement).AVAudioPlayer ne décharge pas la mémoire cache après chaque nouvelle allocation
Est-ce que l'un d'entre vous est confronté à ce problème ou qu'est-ce que je fais de mal dans mon code? J'ai eu ce problème pendant un moment maintenant et il m'embête vraiment puisque mon code est verbatim de ce qu'est Apple (je pense).
Comment puis-je appeler la fonction:
- (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];
}
puis theAudio
est libéré dans la méthode dealloc
bien sûr.