Pregunta

Estoy intentando crear este pequeño proyecto para iPhone, pero cuando lo implemento en el simulador de iOS aparece el error "libc++abi.dylib:terminando con una excepción no detectada de tipo NSException".

El código es bastante sencillo, aquí va:

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

Aquí está el informe completo del fallo:

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

Si alguien pudiera decirme por qué recibo la excepción no detectada, o mejor aún, DÓNDE la obtengo, se lo agradecería mucho.¡Gracias de antemano!

¿Fue útil?

Solución

Esto significa que uno de tus IBActions o IBOutlets dentro de tu storyboard o xib El archivo no está conectado correctamente.El nombre del mismo es playAudio y está dentro de su controlador de vista llamado 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.'
***

Simplemente ingrese al controlador de vista y verifique a qué están conectados todos sus puntos de venta y acciones.Si ve un triángulo amarillo, eso significa que el valor no está definido, debe eliminarlo de su controlador de vista.

playAudio no está definido, pero WHGViewController está intentando usarlo, así que cuando llega al punto en el que llama playAudio, no puede encontrarlo, por lo que su aplicación simplemente falla.

Otros consejos

El error esencialmente implica que sus botones IBoutlets para los botones no están conectados correctamente con XIB / Storyboard.Intente eliminar y volver a conectar salidas en su XIB / Storyboard y eso resolvería el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top