Je suis coincé sur un problème de fuite de mémoire étrange liée à l'Avaudioplayer et j'ai besoin d'aide après avoir essayé tout ce qui me rendait à l'esprit.
Voici la brève description du problème - le code apparaît juste après. J'initialise mon joueur et commence à jouer à la piste sonore dans une boucle sans fin (et une boucle sans fin ou un jeu d'une fois n'a pas changé le problème). Plusieurs secondes après le début de la musique, je passe à une autre piste sonore, donc je crée un nouveau joueur, initialisez-le, libérez l'ancien (qui joue), puis de la lecture en place et de la lire. P> À ce moment-là (juste après que j'appelle le nouveau joueur - [Player Player]) Je reçois une fuite de mémoire (de 3,5 Ko). p>
J'ai essayé ce qui suit: p>
Arrêtez l'ancien joueur, puis relâchez-le - aucun effet p> li>
relâchez le lecteur juste après l'instruction de lecture - ne commençait pas à jouer p> li>
libérer deux fois l'ancien joueur - Crash P> Li>
La fuite de mémoire ne se produit pas lorsque je crée et joue le premier joueur! p> li> ul>
Aussi, dans la référence, il dit que la "pièce" est asynchrone et donc probablement, il augmente le nombre de réfors de 1, mais dans ce cas, pourquoi [Joueur) aidée? p>
merci, p>
Voici quelques parties du code sur la manière dont je l'utilise: p> } p> - (void) ActivateAudioFunction {
[Player setVolume: Volume];
[Player setNumberOfLoops: Repeat];
[Player play];
DuringAudioPrep = false;
4 Réponses :
Votre code est bon pour moi aussi loin que j'ai vu, alors peut-être qu'il y a du code ailleurs qui cause le problème.
Je dirai que vous utilisez une sorte d'idiome étrange. Plutôt que de retenir sur créer et relâcher sur ensemble, je ferais quelque chose comme ceci: p> de cette manière, vous ne conservez que des objets "lecteur" quand ils entrent dans votre Méthode SetAudiaplayer, qui pourrait faciliter la trajectoire. P> Aussi, vérifiez que c'est en fait un objet avaudioplayer qui fuit. Les instruments devraient pouvoir vérifier cela pour vous. P> p>
Merci d'avoir répondu. Oui, j'ai vérifié que c'est l'avalioplayer avec des instruments. En ce qui concerne la méthode - j'utilise celui-ci parce que je sauvegardais les différentes pistes et les réutiliserai par des noms correspondants et si elles ne jouent pas (au lieu de télécharger la même piste plusieurs fois). Puisque je sais que je reçois le joueur de l'appelant après avoir fait un "Alloc" dessus, je sais que c'est déjà retenu (sauf si je ne l'ai pas mal?)
Voici la méthode pour créer Avaudioplayer sans causer des fuites de mémoire. Voir cette page pour expliquer .
J'ai confirmé dans mon application que cela supprima mon avaudioplayer fuit 100%. p>
Ce code est vraiment étrange, il n'y a aucune raison de diviser les appels Alloc vs Init. Pour une meilleure approche générale, voir Stackoverflow.com/Questtions/17603551/ Arc-interdit-Autorelease / ... ou vous pouvez simplement ajouter de l'aorelease comme [[[[Avadioplayer Alloc] Initihdata: Erreur audioData: NULL] AutoRelease]
Essayez d'ajouter MediaPlayer.framework à votre projet P>
mediaplayer.framework code>?
AvadioPlayer CODE> est situé dans
AVFoundation.framework code> et ne doit pas nécessiter
mediaplayer code>. Soins à élaborer?
Implémenter le protocole AvadioplayerDelegate et sa méthode AudioplayerDidFinishPlaying: réussie: puis relâchez l'objet Lecteur audio
par exemple. P>
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { [player release]; // releases the player object }