2011-04-29 4 views
1

Je reçois une fuite de mémoire lorsque je clique sur le bouton de lecture ....MemoryLeak problème dans le cas suivant

Je teste avec cet outil « fuite » sous « outil d'exécution et de performance » .... sur simulateur

Je reçois cette fuite lorsque je clique sur le bouton de lecture première fois .....

Voici mon code ....

-(IBAction)play 
{ 


    [self setPlayer]; 
    [self playme]; 
} 



-(IBAction)stop 
{ 
    [self stopme]; 
    [self releasePlayer]; 

} 


-(void)setPlayer 
{ 

    NSURL *file = [[NSURL alloc] initFileURLWithPath: 
        [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"shut up.mp3"]]; 
    NSError *err = nil; 
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err]; 

    [file release]; 
    player.numberOfLoops = -1; 
    [player prepareToPlay]; 
    player.volume=1.0; 


} 


-(void)playme 
{ 
    if (!isPlaying) 
    { 
     [player play]; 
     isPlaying=YES; 
    } 
} 


-(void)stopme 
{ 
    if (isPlaying) 
    { 
     [player stop]; 
     isPlaying=NO; 
    } 
} 

-(void)releasePlayer 
{ 
    if(!isPlaying) 
    { 
     [player release]; 
     player=nil; 
    } 
    isPlaying=NO; 
} 
+0

n'avez-vous pas posé la même question? –

Répondre

2

Je pense, la déclaration ci-dessous est la source de fuite de mémoire,

player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err]; 

Voici les messages SO qui ont traité du même problème.

AVAudioPlayer memory leak

AVAudioPlayer memory leak

AVAudioPlayer Memory Leak - Media Player Framework

Voici le blog

AVAudioPlayer Memory Leak

ÉDITÉE:

Selon le tutoriel du blog, votre code doit ressembler à celui ci-dessous. La version sans fuite stocke le pointeur retourné par alloc, plutôt que le pointeur renvoyé par initWithData: error :. De cette façon, quoi qu'il arrive, le joueur peut encore être libéré.

+0

Je suis passé par ce blog, mais cela ne m'a pas aidé ... – sajwan

+0

@RSS: essayez avec le code édité et laissez-moi savoir si vous avez encore une fuite de mémoire. – Jhaliya

+0

S'il vous plaît vérifier le code que vous avez écrit .... il a trop d'erreurs ..... et toujours pas m'aide – sajwan

1

L'article de blog dans la réponse de Jhaliya décrit une fuite spécifique à la situation où votre lecteur ne peut pas initialiser l'audio, par exemple lorsqu'il ne trouve pas le fichier.

Le vrai problème avec votre code est que vous ne libérez le lecteur que si l'utilisateur arrête explicitement l'audio. Si l'audio est jouée jusqu'à la fin, vous avez une instance de joueur avec un retainCount de 1. Ensuite, si l'utilisateur rejoue la partie, vous créez un nouveau joueur et l'assignez à la variable player, laissant foirer l'ancienne.

La solution la plus simple pour cela est de faire player une propriété retenue:

@property(nonatomic,retain)AVAudioPlayer *player; 

Ensuite, au lieu d'attribuer à l'Ivar directement, utilisez le mutator pour régler le lecteur, qui libérera implicitement l'instance précédemment défini , s'il y a une:

[self setPlayer:[[[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err] autorelease]; 

Et ne pas oublier de le libérer dans votre dealloc:

-(void)dealloc { 
    [player release]; 
    [super dealloc]; 
} 
Questions connexes