2011-07-05 5 views
0

Je développe une application iPhone 3.1.3.Fuite de mémoire AVAudioRecorder

J'ai le code suivant dans viewDidLoad méthode:

NSURL *url = [NSURL fileURLWithPath:@"/dev/null"]; 

NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithFloat: 44100.0],     AVSampleRateKey, 
          [NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey, 
          [NSNumber numberWithInt: 2],       AVNumberOfChannelsKey, 
          [NSNumber numberWithInt: AVAudioQualityMax],   AVEncoderAudioQualityKey, 
          nil]; 

NSError *error; 

if (recorder == nil) 
    recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; 

if (recorder) { 
    [recorder prepareToRecord]; 
    recorder.meteringEnabled = YES; 
    [recorder record]; 

    levelTimer = [NSTimer scheduledTimerWithTimeInterval: 0.03 
                target: self 
               selector: @selector(levelTimerCallback:) 
               userInfo: nil 
               repeats: YES]; 

Note: je vérifie si recorder a été créé avant de créer une nouvelle avec ce code dans viewDidLoad:

if (recorder == nil) 
     recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; 

Quand je me déplace de ce ViewController à un autre ViewController je fais ceci:

[levelTimer invalidate]; 
levelTimer = nil; 
[recorder pause]; 

Et enfin, je libère recorder sur dealloc:

- (void)dealloc { 
    if (recorder != nil) { 
     [recorder release]; 
     } 
} 

en cours avec l'option Xcode 'Exécuter avec outil de performance', la recherche de fuites, je reçois des fuites avec AVAudioRecorder.

Le programme passera de ce premier ViewController à un second ViewController. Et puis, quand l'utilisateur le veut, il passera du second ViewController au premier ViewController et lancera le premier code que j'ai ajouté.

Y at-il un problème de mémoire? Connaissez-vous une meilleure façon de faire cela? Je veux éviter d'être enregistré pendant que l'utilisateur est dans second viewController.

Répondre

0

Où publiez-vous recorder. Si vous le libérez dans la méthode dealloc, ou si vous ne le libérez pas du tout, vous pouvez avoir une fuite, en supposant que le code que vous avez collé dessus soit déclenché en viewDidLoad ou similaire. recorder recevra un nouveau AVAudioRecorder affecté chaque fois que la vue est rechargée, mais ne sera publiée qu'une seule fois (lorsque le contrôleur de vue est libéré).

+0

Je le publie sur dealloc. – VansFannel

+0

J'ai mis à jour ma question avec plus de détails. Je vérifie si l'enregistreur == nil pour en créer un nouveau, donc je ne pense pas en créer un sur chaque rechargement de vue. – VansFannel