2011-07-05 55 views
0

我正在開發一個iPhone 3.1.3應用程序。AVAudioRecorder內存泄漏

我在viewDidLoad方法如下代碼:

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

注:我是否recorder已創建之前創建viewDidLoad一個新的與此代碼:

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

當我移動從這個ViewController到另一個ViewController我這樣做:

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

最後,我釋放recorderdealloc

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

與「與性能工具運行」的Xcode選項來運行它,尋找泄漏,我越來越泄漏與AVAudioRecorder

程序將從此第一個ViewController轉到第二個ViewController。然後,當用戶需要時,它將從第二個ViewController到第一個ViewController,它將運行我添加的第一個代碼。

是否存在內存問題?你知道更好的方法嗎?我想避免在用戶處於第二個viewController時進行錄製。

回答

0

你在哪裏發佈recorder。如果您使用dealloc方法釋放它,或者根本沒有釋放它,則假設您上面粘貼的代碼是以viewDidLoad或類似方式觸發的,則可能發生泄漏。每當視圖重新加載時,recorder將獲得一個新的AVAudioRecorder,但只會釋放一次(當視圖控制器被釋放時)。

+0

我在dealloc上發佈它。 – VansFannel

+0

我已更新我的問題,並提供更多詳細信息。我檢查記錄器==零創建一個新的,所以我不認爲我在每個視圖重新加載創建一個。 – VansFannel