AVAudioRecorder не сохраняется

Я использую AVAudioRecorder в своем приложении для Mac. В моем файле .m я объявляю

@interface RecordViewController ()
{
    AVAudioRecorder *audioRecorder;
...
}
@end

далее я выделяю объект инициализации следующим образом:

audioRecorder = [[[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recorderSettings error:&error] retain];
...
[audioRecorder prepareToRecord];
...
[audioRecorder record];

Я вижу, что файл создается, но он имеет только 4 КБ. Я не получаю сообщения об ошибке, но когда я проверяю [audioRecorder isRecording], я вижу, что [audioRecorder больше не записывает. Я предполагаю, что объект был освобожден, хотя я не использую ARC и метод Dealloc не вызывался.

У меня была аналогичная проблема с AVAudioPlayer, но дополнительный retain], добавленный к alloc init, решил это.

Что я делаю неправильно?

Спасибо

ОБНОВЛЕНИЕ 1:

Я даже пытался сделать следующее (все тем же методом):

[audioRecorder record];
NSLog(@"recording is ... %d", [audioRecorder isRecording]);

и результат 0. ???

Должен ли я использовать self ? или лениво создавать экземпляр audioRecorder?

ОБНОВЛЕНИЕ 2: я воссоздал проект, назвав его TEST и скопировав исходный код из моего старого проекта. Теперь работает?!?! Иди разберись. Исходники построчно одинаковые. Это известная проблема с XCode?


person Joseph    schedule 24.07.2012    source источник
comment
Вы запускали зомби в программе, чтобы проверить количество сохранений? Если audioRecorder был освобожден, кажется, что вы получите ошибку неправильного доступа, если вызовете isRecording на нем.   -  person Dustin    schedule 24.07.2012
comment
Если я запускаю его в инструментах, NSZombie не создается. Я также не получаю сообщения об ошибке или плохом доступе при вызове isRecording.   -  person Joseph    schedule 24.07.2012


Ответы (2)


Прежде всего, исходя из вашего комментария, если вы все еще можете получить доступ к экземпляру, это означает, что ваш объект не освобожден.

AVAudioRecorder предоставляет делегата (AVAudioRecorderDelegate) пытались ли вы использовать делегат для журнала, если запись прошла успешно, или вы получили какую-то ошибку?

В частности, метод audioRecorderEncodeErrorDidOccur:error: должен дать вам некоторую ошибку, если она возникла во время записи.

Кстати, дополнения retain] не нужны, потому что с alloc init у вас есть право собственности на объект, и вы должны освободить его.

person Luca Bernardi    schedule 24.07.2012
comment
Если бы этот метод делегата был реализован, ошибка не регистрировалась. Я добавил сохранение только потому, что заметил, что объект AVAudioPlayer не останется сохраненным, если я этого не сделаю. Он начинал играть на долю секунды, а затем прекращал. Как только я добавил retain], он заиграл нормально. Я даже стал параноиком и добавил флаги компилятора -fno-objc-arc только для того, чтобы убедиться, что ARC действительно не активен. - person Joseph; 24.07.2012
comment
Я также реализовал -(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag, и это никогда не вызывается. - person Joseph; 24.07.2012
comment
И еще одно уточнение. Когда я вызываю [audioRecorder isRecording], т.е. в NSLog, я получаю в результате 0, но без ошибки. - person Joseph; 24.07.2012

Он не может быть выпущен, если вы его не выпустите, потому что вы выделяете и инициализируете, а не выпускаете (он также не выпускается автоматически).

Если ARC включен, он должен быть сильным.

Посмотрите на http://chinki-singh.blogspot.com/2011/07/how-to-record-audio-using.html

person Can    schedule 24.07.2012
comment
Единственный раз, когда я вызываю [audioRecorder release], это метод dealloc, который не вызывается (у меня есть NSLog в методе, чтобы убедиться). Как уже упоминалось, я создал проект без проверки ARC. - person Joseph; 24.07.2012
comment
Ивары по умолчанию __strong. - person Jonathan Grynspan; 24.07.2012