2010-11-09 2 views
1

Il s'agit d'une API apparemment simple. Je pensais que je relâchais incorrectement l'objet AVAudioRecorder, mais même après avoir éliminé ce problème, je reçois toujours une fuite.fuite de AVAudioRecorder

Voici les quatre méthodes que j'utilise pour gérer l'enregistrement:

-(void) startRecording { 

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord error:&err]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 

NSError *err; 
err = nil; 

AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:audioFileURL settings:nil error:&err]; 

//show user an error on fail 
if (!recorder) { 
     NSLog(@"recorder: %@ %d %@", [err domain], [err code], [[err userInfo] description]); 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Warning" message:[err localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
     return; 
} 

[recorder prepareToRecord]; 
recorder.delegate = self; 
recorder.meteringEnabled = NO; 

self.isRecording = YES; 
[self colorRecordingLight]; 
[self toggleButtons:3]; 

[recorder record]; 

self.audioRecorder = recorder; 
[recorder release]; 

} 

-(void) stopRecording { 

[audioRecorder stop]; 
[self cleanupPostRecording]; 


} 

-(void) audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag { 

//if this page didn't have audio before, it does now. 
self.hasAudio = YES; 
[self cleanupPostRecording]; 

} 

-(void) cleanupPostRecording { 

[[AVAudioSession sharedInstance] setActive:NO error:nil]; 

self.isRecording = NO; 
[self setAudioRecorder:nil]; 
[self toggleButtons:4]; 
[self colorRecordingLight]; 



} 

Je reçois plusieurs fuites (lors de l'exécution sur l'appareil):

Leaked Object # Address Size Responsible Library Responsible Frame 
NSCFDictionary  0x16dc20 64 AVFoundation prepareToRecordQueue(AVAudioRecorder*, AudioRecorderImpl*) 
GeneralBlock-32  0x16cf00 32 AVFoundation prepareToRecordQueue(AVAudioRecorder*, AudioRecorderImpl*) 
NSCFNumber  0x160f30 16 Foundation -[NSPlaceholderNumber initWithUnsignedInteger:] 

Fuites me dit que l'appel que je suis ce qui rend 100% responsable est [recorder prepareToRecord];

Quelqu'un a vu ceci ou pourrait me donner un aperçu?

Répondre

0

J'ai été en mesure d'éliminer cette fuite.

Dans le code que j'ai posté à l'origine, j'ai généré un NSURL à partir d'un NSString et stocké cela dans une propriété.

Chaque fois que j'ai alloué un AVAudioRecorder, je lui ai transmis ce NSURL directement depuis la propriété. En stockant mon emplacement de fichier en tant que variable d'instance NSString et en créant ensuite un nouveau NSURL à partir de cette chaîne et en passant ce nouveau NSURL à mon nouvel AVAudioRecorder alloué, cela fonctionne et ne produit pas ces fuites.