Я надеюсь, что кто-то может поддержать меня в этом ...
Я работал над приложением, которое позволяет конечному пользователю записать небольшой аудиофайл для последующего воспроизведения, и я нахожусь в процессе проверки на утечки памяти. Я продолжаю очень последовательно сталкиваться с утечкой памяти, когда метод «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
Любые мысли будут с благодарностью!