2010-11-09 61 views
1

这是一个看似简单的API。我认为我完全错误地发布了AVAudioRecorder对象,但即使消除了这种担心,我仍然收到了泄漏报告。从AVAudioRecorder泄漏

这里的是四种方法我用它来处理记录:

-(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]; 



} 

我得到多个泄漏(在设备上运行时):

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:] 

泄漏告诉我,呼叫我这是100%负责的[记录器prepareToRecord];

任何人看到这个或可以给我一个见解?

回答

0

我能够消除这种泄漏。

在最初发布的代码中,我从NSString生成了一个NSURL并将其存储在一个属性中。

每次我分配一个AVAudioRecorder,我直接从属性传递给它这个NSURL。

通过将我的文件位置存储为一个NSString实例变量,然后每次从该字符串创建一个新的NSURL,并将这个新的NSURL传递给我新分配的AVAudioRecorder,它可以工作,并且不会产生这些泄漏。