2009-09-15 5 views
2

Je suis nouveau à l'utilisation de avadioplayer et je semble avoir une mémoire quand je joue un son. Je n'arrive pas à comprendre ce qui me manque pour m'en débarrasser à l'intérieur d'Instrument. cela pourrait-il être un faux positif?Programmation de l'iPhone: avaudioplayer fuit la mémoire sur le jeu

ViewController.h:

@interface ISpectatorViewController : UIViewController <UIAccelerometerDelegate>{ 

AVAudioPlayer *massCheerSoundID; 

} 

@property(nonatomic,retain) AVAudioPlayer * massCheerSoundID; 

// ViewController.m

- (void)viewDidLoad { 

    NSString * filePath; 

    filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"]; 

    massCheerSoundID = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath ]error:nil]; 

} 

- (void) playSound 
{ 

     if(massCheerSoundID.playing == false) 
    { 

     massCheerSoundID.currentTime = 0.0; 


       //leak here 
     [massCheerSoundID play]; 
    } 
} 

- (void)dealloc { 

    [super dealloc]; 
    [massCheerSoundID release]; 

} 

Je trouve ce que le problème est.

I pour ajouter le got de AVAudioPlayerDelegate sur l'interface depuis que je me suis fixé le UIAccelerometerDelegate à la place

@interface iSpectatorViewController: UIViewController<AVAudioPlayerDelegate> 

et définissez le

massCheerSoundId.delegate = self 
+2

Cela ne résout pas le problème. Il a toujours la même fuite à - [AVAudioPlayer play] dans Instruments. pourquoi la méthode à jouer le cause-t-elle? ça ne me semble pas juste. –

+1

J'espère aussi que je ne lis pas l'instrument faux aussi. il a seulement montré cette fuite de temps en temps seulement si j'utilise la méthode de playsound. –

Répondre

0

problème pourrait être que vous reinitating le massCheerSoundId et plus si vous ne voulez pas perdre votre point de vue. Donc, si vous ajoutez votre sous-vue, viewDidLoad est appelée et vous initialisez votre lecteur, puis vous supprimez la sous-vue et l'ajoutez à nouveau, puisque vous n'avez pas libéré la vue (en supposant que vous n'avez qu'une seule copie). je ne le pense pas de toute façon), alors si vous ajoutez la vue massCheerSoundId sera surchargé et fuit .., un autre problème pourrait être que puisque vous avez massCheerSoundId en tant que propriété, vous l'allouez et le setter généré le conserve aussi, alors vous sont laissés avec un compte +2 de référence quand il ne devrait être 1 ... donc mon entrée hypothèses sont correctes, je suggère d'écrire viewDidLoad comme celui-ci

- (void)viewDidLoad {  
    NSString * filePath; 
    filePath = [[NSBundle mainBundle] pathForResource:@"massCheer" ofType:@"mp3"]; 
    if(massCharSoundId!=nil) 
{ 
     AVAudioPlayer *p= [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURLfileURLWithPath:filePath ]error:nil];} 
     massCheerSoundID = p; 
    [p release]; 
} 
+0

Est-ce vrai? Vous n'avez pas besoin de: self.massCheerSoundID = p; au lieu? Sinon, qui appelle conserve sur massCheerID? – mahboudz

+0

De plus, vous chargez un son si massCharSound n'est PAS nul? – mahboudz

+0

Ur premier commentaire est correct – Daniel

1

pourrait-il être votre méthode dealloc? Je pense que la convention est d'abord release et ensuite appeler [super dealloc] J'ai toujours supposé que cela était destiné à «libérer d'abord vos trucs, puis que votre classe parente s'en charge».

Votre méthode dealloc devrait lire:

- (void)dealloc { 

    [massCheerSoundID release]; 
    [super dealloc]; 

} 
3

Essayez d'ajouter MediaPlayer.framework à votre projet, sans code change

2

Trouvé la même fuite aujourd'hui. Ajouter MediaPlayer.framework semble corriger cela.

1

Trouvé la même fuite aujourd'hui. Ajouter MediaPlayer.framework semble corriger cela.

Cela a fonctionné pour moi aussi. Étrange.

Questions connexes