2010-08-27 7 views
0

Im faire une application qui a besoin de jouer beaucoup de sons courts (fichiers mp3). Im en utilisant AvAudioPlayer et les sons jouent bien, MAIS les fuites se construisent jusqu'à ce que mon application se bloque.AvAudioPlayer mémoire fuit?

J'ai une classe séparée pour le joueur

AVSnd.h 

#import <Foundation/Foundation.h> 
#import <AVFoundation/AVFoundation.h> 

@interface AVSoundPlayer : NSObject <AVAudioPlayerDelegate> { 
    AVAudioPlayer *msoundPlayer; 
} 
@property (nonatomic, retain) AVAudioPlayer *msoundPlayer; 
-(id)initWithMp3File: (NSString *)inString; 
-(void) playNum:(int)num; 
@end 



AVSND.m 

@implementation AVSoundPlayer 
@synthesize msoundPlayer; 

-(id)initWithMp3File: (NSString *)fileName{ 
    if (self = [super init]){ 
    NSBundle *mainBundle = [NSBundle mainBundle]; 
    NSError *error; 
    NSURL *sURL = [NSURL fileURLWithPath:[mainBundle 
         pathForResource:fileName ofType:@"mp3"]]; 
    self.msoundPlayer = [[AVAudioPlayer alloc] 
         initWithContentsOfURL:sURL error:&error]; 
    if (!self.msoundPlayer) { 
     NSLog(@"Sound player problem: %@", [error localizedDescription]); 
    } 
    } 
    return self; 
} 

-(void) playNum:(int)num{ 
    self.msoundPlayer.numberOfLoops = num; 
    [self.msoundPlayer prepareToPlay]; 
    AVAudioPlayer *tmpPlayer = self.msoundPlayer; 
    [tmpPlayer play]; 
} 

- (void)dealloc { 
    [self.msoundPlayer release]; 
    [super dealloc]; 
} 

@end

Ensuite, je fais une instance de cet objet dans les vues que je veux son.

dans les fichiers .h j'ajouter des lignes suivantes:

@class AVSnd; 
AVSnd *mPlayer; 
@property (nonatomic, retain) AVSnd *mPlayer; 

et dans les fichiers .m i utiliser:

@synthezise mPlayer; 
[self.mPlayer initWithMp3File:@"soundFileName"]; 
[self.mPlayer playNum:1]; 
[self.mPlayer release]; 

Mais pourquoi dois-je obtenir des fuites de mémoire-chaque fois que je joue un son? Dois-je implémenter le joueur d'une autre manière?

Merci beaucoup pour toute aide!

+0

oublié d'ajouter la méthode playNum dans AVSnd.m ici est: - (void) playNum: (int) num { self.msoundPlayer.numberOfLoops = num; // utilise uniquement la boucle 1 [self.msoundPlayer prepareToPlay]; AV12Player * tmpPlayer = self.msoundPlayer; [tmpPlayer play]; } –

Répondre

1
self.msoundPlayer = [[AVAudioPlayer alloc] 
        initWithContentsOfURL:sURL error:&error]; 

Ici, vous retenez l'objet deux fois, en self. (à cause de la propriété), et quand alloc. Cela pourrait être la raison.

+0

J'ai essayé de changer cette ligne pour: [self.msoundPlayer initWithContentsOfURL: erreur sURL: & error]; Mais fuit toujours. –

+0

Si vous faites cela, vous n'allouez pas de mémoire ... Peut-être avec ceci: AVAudioPlayer * helper = [[AVAudioPlayer alloc] initWithContentsOfURL: erreur sURL: & erreur]; self.msoundPlayer = helper; [libération d'aide]; – toupper

2

J'ai eu le même problème et résolu avec autorelease:

self.audioPlayer = [[[AVAudioPlayer alloc] 
          initWithContentsOfURL:url error:&error] autorelease]; 
Questions connexes