Утечки памяти AVAudioRecorder - PullRequest
0 голосов
/ 05 июля 2011

Я разрабатываю приложение для iPhone 3.1.3.

У меня есть следующий код в 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];

И, наконец, я выпускаю recorder на dealloc:

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

Запуск его с опцией Xcode «Запуск с Performance Tool», поиск утечек, я получаю утечки с AVAudioRecorder.

Программа перейдет из этого первого ViewController во второй ViewController. И затем, когда пользователь захочет, он перейдет от второго ViewController к первому ViewController и выполнит первый добавленный мной код.

Есть ли проблемы с памятью? Вы знаете лучший способ сделать это? Я хочу избежать записи, пока пользователь находится во втором viewController.

1 Ответ

0 голосов
/ 05 июля 2011

Где вы выпускаете recorder.Если вы выпускаете его в методе dealloc или не выпускаете его вообще, у вас может быть утечка, если предположить, что код, который вы вставили выше, запускается в viewDidLoad или аналогичном.recorder будет получать новый AVAudioRecorder, назначенный ему каждый раз, когда перезагружается представление, но будет освобожден только один раз (когда контроллер представления освобожден).

...