【问题标题】:NSDictionary Memory Leak as Class VarNSDictionary Memory Leak as Class Var
【发布时间】:2011-09-08 18:33:18
【问题描述】:

我有一个在 iOS 上录制音频的课程。我有一个audioSettings 的类变量,它是一个带有录音机设置的字典。我在类加载时创建此obj 一次,然后调用recordAudio 方法,我将该字典分配给录音机。录制完成后我releasenil audioRecorder。代码如下:

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

所以我可以在不释放整个类的情况下再次使用它。

【问题讨论】:

  • 您的问题是什么?什么是“类变量”?使用访问器而不是 ivars 将使这一切更清晰,并避免您在 recordAudio: 中的保留不足(正如 Nekto 所指出的)。
  • obj c 中的类范围变量是什么?
  • Objective-C 本身没有类变量。有静态变量,可以实现基本一样的东西。您的命名很不清楚audioRecorder 是一个实例变量,audioSettings 是一个静态变量。最好对实例变量使用属性,对类(静态)变量使用类方法。

标签: objective-c cocoa-touch memory-leaks nsdictionary


【解决方案1】:

您应该在setDefaultSettings 中使用retain audioSettings 或使用其他分配方法或通过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];
}

【讨论】:

  • 我应该在 init 上创建我的 audioRecorder 并保留它,还是根据需要销毁并重新创建它?还是那两个贵?我可以在另一个线程中创建它。您的答案使用 alloc 和 initwithobjecandkeys 工作
  • 因为我没有看到 hiw 正在使用 audioRecorder 并且没有使用它的内容,所以我不能 100% 确定。您可以使用 Instruments 和测试性能,因此您可以选择最有效的变体
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-30
  • 2011-09-20
  • 2022-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
相关资源
最近更新 更多