Утечка памяти AVAudioRecorder - PullRequest
2 голосов
/ 18 марта 2010

Я надеюсь, что кто-то может поддержать меня в этом ...

Я работал над приложением, которое позволяет конечному пользователю записать небольшой аудиофайл для последующего воспроизведения, и я нахожусь в процессе проверки на утечки памяти. Я продолжаю очень последовательно сталкиваться с утечкой памяти, когда метод «stop» AVAudioRecorder пытается закрыть аудиофайл, в который он записывает. Кажется, это действительно утечка в самой платформе, но если я тупица, вы можете сказать мне.

Чтобы проиллюстрировать это, я разработал урезанное тестовое приложение, которое ничего не делает, кроме запуска / остановки записи с нажатием кнопки. Ради простоты, все происходит в приложении. делегировать следующим образом:

@synthesize audioRecorder, button;
@synthesize window;

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
 // create compplete path to database
 NSString *tempPath = NSTemporaryDirectory();
 NSString *audioFilePath = [tempPath stringByAppendingString:@"/customStatement.caf"];

 // define audio file url
 NSURL *audioFileURL = [[NSURL alloc] initFileURLWithPath:audioFilePath];

 // define audio recorder settings
 NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
      [NSNumber numberWithInt:kAudioFormatAppleIMA4], AVFormatIDKey,
      [NSNumber numberWithInt:1], AVNumberOfChannelsKey,
      [NSNumber numberWithInt:AVAudioQualityLow], AVSampleRateConverterAudioQualityKey,
      [NSNumber numberWithFloat:44100], AVSampleRateKey,
      [NSNumber numberWithInt:8], AVLinearPCMBitDepthKey,
      nil
 ];

 // define audio recorder
 audioRecorder = [[AVAudioRecorder alloc] initWithURL:audioFileURL settings:settings error:nil];
 [audioRecorder setDelegate:self];
 [audioRecorder setMeteringEnabled:YES];
 [audioRecorder prepareToRecord];

 // define record button
 button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 [button addTarget:self action:@selector(handleTouch_recordButton) forControlEvents:UIControlEventTouchUpInside];
 [button setFrame:CGRectMake(110.0, 217.5, 100.0, 45.0)];
 [button setTitle:@"Record" forState:UIControlStateNormal];
 [button setTitle:@"Stop" forState:UIControlStateSelected];

 // configure the main view controller
 UIViewController *viewController = [[UIViewController alloc] init];
 [viewController.view addSubview:button];

 // add controllers to window
 [window addSubview:viewController.view];
 [window makeKeyAndVisible];

 // release
 [audioFileURL release];
 [settings release];
 [viewController release];

 return YES;
}

- (void) handleTouch_recordButton {
 if ( ![button isSelected] ) {
      [button setSelected:YES];
      [audioRecorder record];

 } else {
      [button setSelected:NO];
      [audioRecorder stop];
 }
}

- (void) dealloc {
 [audioRecorder release];
 [button release];

 [window release];

 [super dealloc];
}

Трассировка стека от Instruments, которая довольно ясно показывает, что метод "closeFile" в коде AVFoundation протекает ... что-то. Снимок экрана сеанса инструментов можно посмотреть здесь: Форумы разработчиков: утечка памяти в AVAudioRecorder

Любые мысли будут с благодарностью!

Ответы [ 3 ]

3 голосов
/ 18 марта 2010

Я ничего не вижу, и если Clang не обнаружит утечку в вашем коде, ваш код вряд ли будет виноват. Похоже, утечка в рамках.

Я бы не потел. Утечка в 16 байт, когда пользователь нажимает «Стоп», вряд ли вызовет проблемы. Вам придется остановить тысячи записей, прежде чем накопленные утечки станут достаточно большими, чтобы вызвать проблемы. Небольшие утечки вызывают беспокойство только тогда, когда они быстро повторяются, например, в большой петле.

Это раздражает и эстетически отталкивает, чтобы оставить известную утечку, но время - деньги, и я не буду тратить впустую ни на что, если вы не знаете, что это серьезная проблема

2 голосов
/ 18 июня 2011

Я почти уверен, что могу поддержать вас в этом. Я просто не успел подать отчет об ошибке. Я получаю ту же утечку. Обычно он составляет 256 байт, если я использую формат Apple без потерь, но сокращает себя до 48 байт, если я использую AAC.

Я потратил 3 часа на тестирование и пытался закомментировать другой код. Ничто не было абсолютно воспроизводимым, хотя я мог почти все время вытекать из него. Если бы после сообщения «стоп» я вынул какой-то код, я обычно мог бы сделать так, чтобы он не протекал. По сути, когда у меня сразу после остановки выполнялась куча логики / обработки / обработки, она протекала. Если бы я только что закомментировал весь код после этого, он бы не просочился (обычно).

Я также пробовал другие вещи, такие как изменение настроек записи (разные качества, битрейт и т. Д.) И опять же, ничего слишком предсказуемого, чтобы сделать какие-либо научные выводы.

Я знаю, что этому посту год, но, насколько я вижу, он все еще не исправлен.

0 голосов
/ 22 августа 2011

У меня та же проблема, как в симуляторе, так и на устройстве. Происходит утечка 48 байтов, как только я остановлю AVAudioRecorder.

Метод утечки:

closeFile(AVAudioRecorder*,AudioRecorderImpl*)

Вот скриншот сеанса профилирования, выполненного с приложением, работающим на устройстве под управлением iOS 4.3.x

enter image description here

...