2010-05-03 4 views
1

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 AudioToolBoxCache_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.

Répondre

2

réponse d'une autre source nommée Smasher:

Vous avez besoin d'un lecteur pour chaque son avec AVAudioPlayer; il n'y a pas de choix. Et la seule façon de libérer de la mémoire du lecteur est de le relâcher correctement une fois la lecture terminée. Le simple fait d'appeler "stop" maintient le lecteur en vie pour que vous puissiez le rejouer et ne libère aucune mémoire. Open12 a des problèmes similaires, vous chargez un son pour chaque fichier; plus l'implémentation la plus commune que j'ai vu charge le fichier entier à la fois ce qui est dur sur la mémoire.

Vous devriez probablement libérer le joueur quand il arrête de jouer, ou lorsque vous choisissez un nouveau son, ou devant un lecteur pour le nouveau son est créé.