2011-09-08 42 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