2009-04-08 8 views
2

Vu le code:Est-ce la bonne façon d'utiliser AVAudioPlayer, est-ce que mon code est correct?

soundFilePath = [[NSBundle mainBundle] pathForResource: @"Sound" ofType: @"wav"];  
    fileURL = [[NSURL alloc] initFileURLWithPath: soundFilePath]; 
    avPlayerNextLevel = [[AVAudioPlayer alloc] initWithContentsOfURL: fileURL error: nil]; 
    avPlayerNextLevel1.volume = volume ; 
    [soundFilePath release]; 
    [fileURL release]; 

Pour lire le son que je fais alors

if([avPlayerNextLevel prepareToPlay]){ 
     [avPlayerNextLevel play]; 
    } 

Je le fais à plusieurs reprises dans mon jeu. Parfois, sur le simulateur, le son cesse de jouer. Et quand parfois je détecte des fuites de mémoire avec AvAudioPlayer.

Est-ce que tout va bien avec mon code?

Répondre

8

Vous devez libérer l'instance de AVAudioPlayer que vous avez créée. Étant donné que le code ci-dessus définit le délégué à l'auto, mettre en œuvre juste la méthode suivante et la libération il y a:

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
    NSLog(@"Audio finished playing."); 
    [player release]; 
} 
0
  1. Pourquoi vous release inG une référence -owning non (soundFilePath)?
  2. Vous n'avez pas besoin de manuellement prepareToPlay si vous appelez play juste après.

Citant la documentation play:

Discussion

L'appel de cette méthode appelle implicitement la méthode prepareToPlay si le lecteur audio n'est pas déjà prêt à jouer.

Personnellement, je fais ceci:

NSURL *soundUrl = [NSURL fileURLWithPath: 
        [[NSBundle mainBundle] pathForResource:track 
                ofType:nil]]; 
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl 
                error:nil]; 
[audioPlayer setDelegate:self]; 
[audioPlayer play]; 

audioPlayer est un ivar et track est un lvar de type NSString* que j'ai obtenu plus tôt où que je configure la chanson suivante à jouer.

+0

Vous avez raison, j'ai un code similaire et la releaseing de soundFilePath provoquera une exception à se produire lorsque exécute [de libération du joueur] . – Mike

0

J'ai travaillé sur quelque chose de similaire mais j'utilisais un morceau de code légèrement différent. Malheureusement, j'ai eu des fuites de mémoire, donc j'ai décidé d'essayer le code que vous avez posté. Même résultat: la mémoire fuit à nouveau lorsque j'appelle [lecture du lecteur audio];

Je n'arrive pas vraiment à comprendre ce qui se passe. Êtes-vous conscient de fuites de mémoire lorsque AVAudioPlayer est impliqué?

Questions connexes