2011-09-08 41 views
0

我有一個在iOS上記錄音頻的類。我有一個類變量audioSettings這是一個字典與音頻記錄器設置。我在類加載時創建obj一次,然後調用recordAudio方法,我將該字典分配給錄音機。錄音結束後,我releasenilaudioRecorder。下面是代碼:NSDictionary內存泄漏作爲類變量

- (void) recordAudio: (NSURL *) fileURL { 
    NSError * error = nil; 
    if (!audioSettings) { 
     //If no dict, fill it 
     [self setDefaultSettings]; 
    } 

    audioRecorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:audioSettings error:&error]; 

    //audioRecorder.delegate = self; 

    if (!error) { 
     [audioRecorder prepareToRecord]; 

     if (!audioRecorder.recording) { 
      [audioRecorder record]; 
     } 
    } else { 
     NSLog(@"Create Error: %@", [error localizedDescription]); 
    } 
} 

下面是創建字典:

- (void) setDefaultSettings { 

    audioSettings = [NSDictionary dictionaryWithObjectsAndKeys: 
        [NSNumber numberWithInt:AVAudioQualityMin], 
        AVEncoderAudioQualityKey, 
        [NSNumber numberWithInt:16], 
        AVEncoderBitRateKey, 
        [NSNumber numberWithInt:2], 
        AVNumberOfChannelsKey, 
        [NSNumber numberWithFloat:44100.0], 
        AVSampleRateKey, nil]; 
} 

記錄結束後我設置:

[audioRecorder release]; 
audioRecorder = nil; 

這樣我就可以再次使用它而無需釋放整個類。

+1

什麼是你的問題?這裏是什麼「class var?」使用訪問器而不是ivars會使這一切變得更加清晰,並避免在'recordAudio'中產生的不足(如Nekto指出的那樣)。 –

+0

你在obj c中調用什麼類的var? – Mike007

+0

Objective-C中本身沒有類變量。有靜態變量,可以實現基本相同的事情。你的命名使得audioRecorder是一個實例變量而且audioSettings是一個靜態變量是非常不清楚的。對類(靜態)變量使用實例變量和類方法的屬性會更好。 –

回答

1

您應該retainaudioSettingssetDefaultSettings或使用其他分配方法或通過self.表示法設置值。

例如,我的一個替代你的方法:

- (void) setDefaultSettings { 

    audioSettings = [[NSDictionary dictionaryWithObjectsAndKeys: 
       [NSNumber numberWithInt:AVAudioQualityMin], 
       AVEncoderAudioQualityKey, 
       [NSNumber numberWithInt:16], 
       AVEncoderBitRateKey, 
       [NSNumber numberWithInt:2], 
       AVNumberOfChannelsKey, 
       [NSNumber numberWithFloat:44100.0], 
       AVSampleRateKey, nil] retain]; 
} 
+0

我應該在init上創建我的audioRecorder並保存它,或根據需要銷燬並重新創建它?還是那兩個很貴?我可以在另一個線程中創建它嗎?你的答案使用alloc和initwithobjecandkeys – Mike007

+0

因爲我沒有看到hiw使用'audioRecorder'而沒有它的內容,所以我不能100%肯定地回答。您可以使用儀器和測試性能,因此您可以選擇最高效的變體 – Nekto