Ошибка при использовании AVAudioRecorder

#objective-c

#objective-c

Вопрос:

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

 -(void)deleteCurrentFiles {
    if(recorder != nil) {
        if([recorder isRecording]) {
            [recorder stop];
        }
        [recorder release];
        recorder = nil;
        [self performSelector:@selector(resetTotalTimeLabel) withObject:nil afterDelay:1.0];
    }

    if(player != nil) {
        if([player isPlaying]) {
            [player stop];
        }
        [player release];
        player = nil;
        currentTime = 0;
        timeSlider.value = 0;
        [self performSelector:@selector(resetCurrentTimeLabel) withObject:nil afterDelay:0.1];
    }

    if(commentRecorder != nil) {
        if([commentRecorder isRecording]) {
            [commentRecorder stop];
        }
    }
}
 

Объявления этих экземпляров:

 AVAudioRecorder *recorder;
AVAudioRecorder *commentRecorder;
AVAudioPlayer *player;
 

В resetTotalTimeLabel и resetCurrentTimeLabel нет ссылки на / использование рекордеров / проигрывателя.

Ошибка, которую я получаю,:

 -[__NSArrayI finishedRecording]: unrecognized selector sent to instance 0x1b3ba0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI finishedRecording]: unrecognized selector sent to instance 0x1b3ba0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x35f08c7b __exceptionPreprocess   114
    1   libobjc.A.dylib                     0x30186ee8 objc_exception_throw   40
    2   CoreFoundation                      0x35f0a3e3 -[NSObject(NSObject) doesNotRecognizeSelector:]   98
    3   CoreFoundation                      0x35eaf467 ___forwarding___   506
    4   CoreFoundation                      0x35eaf220 _CF_forwarding_prep_0   48
    5   CoreFoundation                      0x35ea3f79 -[NSObject(NSObject) performSelector:withObject:]   24
    6   Foundation                          0x33fd3e6d __NSThreadPerformPerform   272
    7   CoreFoundation                      0x35ebc8d1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__   14
    8   CoreFoundation                      0x35e8cecd __CFRunLoopDoSources0   384
    9   CoreFoundation                      0x35e8c6f9 __CFRunLoopRun   264
    10  CoreFoundation                      0x35e8c50b CFRunLoopRunSpecific   226
    11  CoreFoundation                      0x35e8c419 CFRunLoopRunInMode   60
    12  GraphicsServices                    0x35261d24 GSEventRunModal   196
    13  UIKit                               0x3386557c -[UIApplication _run]   588
    14  UIKit                               0x33862558 UIApplicationMain   972
    15  App Name                            0x00002959 main   80
    16  App Name                            0x00002904 start   40
)
terminate called after throwing an instance of 'NSException'
 

На самом деле это происходит recorder после вызова этого метода.. Итак, есть ли что-нибудь, что я должен добавить к этому методу, чтобы заставить его работать?

Любые мысли очень ценятся!

Ответ №1:

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

Комментарии:

1. Похоже, это действительно проблема зомби.. Но я не называю это так, насколько мне известно… Может быть, это авторелиз (кстати, я не вызывал никакого авторелиза)? я создаю диктофон как таковой: recorder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:amp;error];

2. То, что вы мне сказали, на самом деле заставило меня прийти к следующему выводу: проблема заключается в том, что диктофон не был остановлен ( [recorder stop] ) перед выпуском. По какой-то причине, даже если он не воспроизводится, когда его выпускают, он все равно хочет, чтобы его остановили, я думаю.. Итак, вкратце: if([recorder isRecording]) { [recorder stop]; } становится: [остановка диктофона];