2010-11-09 38 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,它可以工作,並且不會產生這些泄漏。