Утечка памяти NSDictionary как класс Var - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть класс, который записывает аудио на iOS. У меня есть класс var audioSettings, это словарь с настройками аудио-рекордера. Я создаю этот obj один раз, когда класс загружается, и затем вызывается метод recordAudio, я назначаю этот диктофон для устройства записи звука. После окончания записи я release и nil 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;

Так что я могу использовать его снова, не освобождая весь класс.

1 Ответ

1 голос
/ 08 сентября 2011

Вы должны retain audioSettings в setDefaultSettings или использовать другой метод выделения или установить значение с помощью 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];
}
...