Вопрос

Я пытаюсь создать этот небольшой проект для iPhone, но когда я развертываю его на симуляторе iOS, я получаю сообщение об ошибке "libc ++abi.dylib:завершается неперехваченным исключением типа NSException".

Код довольно прост, вот он:

WHGViewController.h:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface WHGViewController : UIViewController <AVAudioRecorderDelegate, AVAudioPlayerDelegate>

@property (strong, nonatomic) AVAudioRecorder* rec;
@property (strong, nonatomic) AVAudioPlayer* ply;
@property (strong, nonatomic) IBOutlet UIButton *recBtn;
@property (strong, nonatomic) IBOutlet UIButton *plyBtn;
@property (strong, nonatomic) IBOutlet UIButton *stopBtn;

- (IBAction)recordAudio:(id)sender;
- (IBAction)playAudio:(id)sender;
- (IBAction)stop:(id)sender;

@end

WHGViewController.m:

#import "WHGViewController.h"

@interface WHGViewController ()

@end

@implementation WHGViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _plyBtn.enabled = NO;
    _stopBtn.enabled = NO;

    NSArray *dirPaths;
    NSString *docsDir;

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    docsDir = dirPaths[0];

    NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"test.caf"];

    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

    NSDictionary *recordSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:AVAudioQualityMin],
                                    AVEncoderAudioQualityKey,
                                    [NSNumber numberWithInt:16],
                                    AVEncoderBitRateKey,
                                    [NSNumber numberWithInt:2],
                                    AVNumberOfChannelsKey,
                                    [NSNumber numberWithFloat:44100.0],
                                    AVSampleRateKey,
                                    nil];

    NSError *error = nil;
    _rec = [[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recordSettings error:&error];

    if(error){
        NSLog(@"error: %@", [error localizedDescription]);
    } else {
        [_rec prepareToRecord];
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (IBAction)recordAudio:(id)sender {
    _plyBtn.enabled = NO;
    _stopBtn.enabled = YES;
    [_rec record];
}

- (IBAction)playAudio:(id)sender {
    if(!_rec.recording){
        _recBtn.enabled = NO;
        _stopBtn.enabled = YES;

        NSError *error;

        _ply = [[AVAudioPlayer alloc] initWithContentsOfURL:_rec.url error:&error];

        _ply.delegate = self;

        if(error){
            NSLog(@"error: %@", [error localizedDescription]);
        } else {
            [_ply play];
        }
    }
}

- (IBAction)stop:(id)sender {

    _stopBtn.enabled = NO;
    _recBtn.enabled = YES;
    _plyBtn.enabled = YES;

    if(_rec.recording) {
        [_rec stop];
    } else if(_ply.playing) {
        [_ply stop];
    }
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    _recBtn.enabled = YES;
}

- (void)audioPlayerDecodeErrorDidOccur:(AVAudioPlayer *)player error:(NSError *)error {
    NSLog(@"Decode error did occur");
}

- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag {

}

- (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error {
    NSLog(@"Encode error did occur");
}

@end

Вот полный отчет о сбое:

2013-11-15 23:51:08.814 WhisperClient[51402:70b] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<WHGViewController 0x9564950> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key playAudio.'
*** First throw call stack:
(
    0   CoreFoundation                      0x019665e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x016e98b6 objc_exception_throw + 44
    2   CoreFoundation                      0x019f66a1 -[NSException raise] + 17
    3   Foundation                          0x013aa9ee -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] + 282
    4   Foundation                          0x01316cfb _NSSetUsingKeyValueSetter + 88
    5   Foundation                          0x01316253 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 267
    6   Foundation                          0x0137870a -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 412
    7   UIKit                               0x006f9a15 -[UIRuntimeOutletConnection connect] + 106
    8   libobjc.A.dylib                     0x016fb7d2 -[NSObject performSelector:] + 62
    9   CoreFoundation                      0x01961b6a -[NSArray makeObjectsPerformSelector:] + 314
    10  UIKit                               0x006f856e -[UINib instantiateWithOwner:options:] + 1417
    11  UIKit                               0x0056a605 -[UIViewController _loadViewFromNibNamed:bundle:] + 280
    12  UIKit                               0x0056adad -[UIViewController loadView] + 302
    13  UIKit                               0x0056b0ae -[UIViewController loadViewIfRequired] + 78
    14  UIKit                               0x0056b5b4 -[UIViewController view] + 35
    15  UIKit                               0x004939fd -[UIWindow addRootViewControllerViewIfPossible] + 66
    16  UIKit                               0x00493d97 -[UIWindow _setHidden:forced:] + 312
    17  UIKit                               0x0049402d -[UIWindow _orderFrontWithoutMakingKey] + 49
    18  UIKit                               0x0049e89a -[UIWindow makeKeyAndVisible] + 65
    19  UIKit                               0x00451cd0 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1851
    20  UIKit                               0x004563a8 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
    21  UIKit                               0x0046a87c -[UIApplication handleEvent:withNewEvent:] + 3447
    22  UIKit                               0x0046ade9 -[UIApplication sendEvent:] + 85
    23  UIKit                               0x00458025 _UIApplicationHandleEvent + 736
    24  GraphicsServices                    0x02f192f6 _PurpleEventCallback + 776
    25  GraphicsServices                    0x02f18e01 PurpleEventCallback + 46
    26  CoreFoundation                      0x018e1d65 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
    27  CoreFoundation                      0x018e1a9b __CFRunLoopDoSource1 + 523
    28  CoreFoundation                      0x0190c77c __CFRunLoopRun + 2156
    29  CoreFoundation                      0x0190bac3 CFRunLoopRunSpecific + 467
    30  CoreFoundation                      0x0190b8db CFRunLoopRunInMode + 123
    31  UIKit                               0x00455add -[UIApplication _run] + 840
    32  UIKit                               0x00457d3b UIApplicationMain + 1225
    33  WhisperClient                       0x0000363d main + 141
    34  libdyld.dylib                       0x03afb70d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Если бы кто-нибудь мог сказать мне, почему я получаю неперехваченное исключение или, что еще лучше, ОТКУДА я его получаю, я был бы очень благодарен.Заранее спасибо!

Это было полезно?

Решение

Это означает, что один из ваших IBActions или IBOutlets внутри вашего storyboard или xib файл неправильно подключен.Название этого таково playAudio и это находится внутри вашего контроллера просмотра с именем WHGViewController:

2013-11-15 23:51:08.814 WhisperClient[51402:70b] 
***
  Terminating app due to uncaught exception 'NSUnknownKeyException',
  //Here it says that the error is in WHGViewController
  reason: '[<WHGViewController 0x9564950> setValue:forUndefinedKey:]:
      //Here it says that the IBAction/IBOutlet is named playAudio
      this class is not key value coding-compliant for the key playAudio.'
***

Просто зайдите в view controller и проверьте, к чему подключены все ваши розетки и действия.Если вы видите желтый треугольник, это означает, что значение не определено, вы должны удалить его из вашего контроллера представления.

playAudio не определен, но WHGViewController пытается использовать его, поэтому, когда он доходит до той точки, где он вызывает playAudio, он не может его найти, поэтому ваше приложение просто выходит из строя.

Другие советы

Ошибка по существу подразумевает ваши iboutlets для кнопок не совсем подключены к XIB / раскадровке.Пожалуйста, попробуйте удалить и переподключать розетки в вашем XIB / раскаренной доске, и это решит бы проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top