***终止应用程序由于未捕获的异常'NSInvalidArgumentException'无法识别的选择器发送到实例

时间:2013-02-24 23:32:49

标签: objective-c runtime-error nsexception

所以我使用asyncsocket库https://github.com/caydenliew/AsyncSocket。 我有一个按钮,按下时会将字符串发送到服务器。没有错误,但我得到以下异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-

[key sendData:]: unrecognized selector sent to instance 0x1002f810'
*** First throw call stack:
(0x18ce012 0x16f3e7e 0x19594bd 0x18bdbbc 0x18bd94e 0x3f26 0x1707705 0x63b2c0 0x63b258 0x6fc021 0x6fc57f 0x6fb222 0x66ab1d 0x66af02 0x648d4a 0x63a698 0x26b1df9 0x26b1ad0 0x1843bf5 0x1843962 0x1874bb6 0x1873f44 0x1873e1b 0x26b07e3 0x26b0668 0x637ffc 0x46fd 0x2865 0x1)
libc++abi.dylib: terminate called throwing an exception

这是keyViewController.h

@interface keyViewController ()
{
CFURLRef sysSoundTestPath;
GCDAsyncSocket *asyncSocket;

}
 -(IBAction) touchB:(id)sender;
 -(IBAction)touchE:(id)sender;
 -(void)loadViewFromNIB:(NSString *)nibName owner:(id)owner;
 - (void)sendData:(NSString *) dataSend ;
@end

和.m

@implementation keyViewController
- (void)sendData: (NSString *) dataSend {
    if (asyncSocket == nil) {
        asyncSocket = [(keyAppDelegate *)[[UIApplication sharedApplication] delegate] asyncSocket];
        asyncSocket.delegate = self;
    }

    NSData *data = [dataSend dataUsingEncoding:NSUTF8StringEncoding];

    //write data to server
    [asyncSocket writeData:data withTimeout:-1 tag:0];
    //listen to server for message
    [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:30.0 tag:1];
}

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
    //data from server
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",str);
}

- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag {
    //prepare to read the next message from server again
    [asyncSocket readDataToData:[GCDAsyncSocket CRLFData] withTimeout:30.0 tag:1];
}


- (IBAction)touchB:(id)sender
{

    NSLog(@"down");
    NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
    NSURL* url = [NSURL fileURLWithPath:path];
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID( (CFURLRef)objc_unretainedPointer(url), &soundID);
    AudioServicesPlaySystemSound(soundID);
    [sender transmitHandle];
     NSString *name =  [sender restorationIdentifier];
    [sender sendData:name];


}

- (IBAction)touchE:(id)sender
{
    NSLog(@"up");
    [sender transmitHandle];
}

-(void)loadViewFromNIB:(NSString *)nibName owner:(id)owner
{


    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:nil];
    NSArray *subviews = [objects[0]subviews];
    for (UIView *subview in subviews) {
        if ([subview isKindOfClass:[UIButton class]]) {
            UIButton *key = (UIButton *)subview;
            [key addTarget:self action:@selector(touchB:) forControlEvents:UIControlEventTouchDown];
            [key addTarget:self action:@selector(touchE:) forControlEvents:UIControlEventTouchUpInside];

            //NSString *ident = key.restorationIdentifier;
            //NSLog(@"%@",ident);
        }
    }
}

- (void)viewDidLoad

{
    [super viewDidLoad];
    [self.view setMultipleTouchEnabled:YES];
    [self loadViewFromNIB:@"keyViewController" owner:self];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
     //Dispose of any resources that can be recreated.
}

@end

我做错了什么???

1 个答案:

答案 0 :(得分:0)

IBAction的发件人是按下的按钮。 sendData是控制器的一种方法。您正在将sendData发送到按下的按钮。将发件人更改为自己。我不确定你要发送到发送数据方法的字符串,但我不确定你的按钮是否有属性调用restorationIdentifier。

- (IBAction)touchB:(id)sender
{

    NSLog(@"down");
    NSString *path = [[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"];
    NSURL* url = [NSURL fileURLWithPath:path];
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID( (CFURLRef)objc_unretainedPointer(url), &soundID);
    AudioServicesPlaySystemSound(soundID);
    [sender transmitHandle];
     NSString *name =  [sender restorationIdentifier];
    //I'm not sure what string you're trying to send to the send data method.
    NSLog(@"Sending:%@ to sendData method", name);
    [self sendData:name];


}