7
votes

Fuite de mémoire avaudioplayer

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> xxx pré>

    } p>

    - (void) ActivateAudioFunction {
    [Player setVolume: Volume];
    [Player setNumberOfLoops: Repeat];    
    [Player play];
    
    DuringAudioPrep = false;
    


0 commentaires

4 Réponses :


0
votes

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: xxx

de cette manière, vous ne conservez que des objets "lecteur" quand ils entrent dans votre Méthode SetAudiaplayer, qui pourrait faciliter la trajectoire.

Aussi, vérifiez que c'est en fait un objet avaudioplayer qui fuit. Les instruments devraient pouvoir vérifier cela pour vous.


1 commentaires

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?)



7
votes

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%. xxx


1 commentaires

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]



-2
votes

Essayez d'ajouter MediaPlayer.framework à votre projet


1 commentaires

mediaplayer.framework ? AvadioPlayer est situé dans AVFoundation.framework et ne doit pas nécessiter mediaplayer . Soins à élaborer?



2
votes

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
}


0 commentaires