错误:无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】错误:无法识别的选择器发送到实例【英文标题】:Error : unrecognized selector sent to instance 【发布时间】:2016-03-18 05:35:01 【问题描述】:

我遇到过类似的问题,但无法解决我的问题。 问题是我调用了 API,我将响应存储在 NSDictionary 中,响应是单个值,例如 REDGREEN

saveBlock:^( NSDictionary *data, NSError **err )

    if (! *err)
    
         if (data)
         
             NSLog(@"KEY %@ - VALUE %@",data.allKeys,data.allValues); //Error because i am performing .allKeys on type NSString
             NSString *str = data; // error because i am assigning NSDictionary to string.
         
     
     else
     
        NSLog(@" error is : - %@",*err);
     
];

这两个错误信息不是相互矛盾吗?任何人解释这个问题。谢谢。

EDIT 第一个NSLog 给出了这个错误:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString allKeys]: unrecognized selector sent to instance 0x170664b80' (此错误仅在运行时出现,而不是在我键入 data.allKeys 时出现)

第二个NSLog 给出:不兼容的指针类型,用NSDictionary * 类型的表达式初始化NSString* (这是打字后显示的,我不知道这种类型的错误叫什么:D)

【问题讨论】:

请显示异常消息的详细信息 - 对象类型是什么,调用的选择器是什么?从您的 cmets 看来 data 是一个字符串,因此您应该将块更改为 saveBlock:^( NSString *data, NSError **err ) 而不要尝试访问键和值 第一个错误发生在运行时吗? @Paulw11 - 抱歉,我无法将 NSDictionary 更改为 NSString,这是我正在进行的一个巨大项目。 @Fonix- 是的,第一个是运行时错误。 问题是Objective-C,就像C一样信任你,所以如果你说dataNSDictionary *那么它不会在编译时抱怨如果您使用NSDictionary 消息,例如allKeys。当您尝试将其分配给 NSString * 时,它确实会抱怨,因为您说它是一本字典。现在,在运行时,如果您将NSString * 传递给此方法(这就是您正在执行的操作),那么当您尝试将其视为字典时,您将得到一个异常,因为它不是一个!因此,您可以更改传递给此方法的内容,也可以更改参数类型 【参考方案1】:

在执行任何操作之前检查您的响应类型和错误消息是一种标准做法,这是一种防御性编码。

例如。

     DLog(@"Object:%@,Error:%@",responseObject,error);
     if (error != nil) 
         DLog(@"Got error from API:%@",error);
         return ;
     
     if (!responseObject) 
         DLog(@"Response object is not valid, returning...");
         return;
     
     if (![responseObject isKindOfClass:[NSDictionary class]]) 
         DLog(@"Incorrect type of returned object, expecting NSDictionary, got:%@",[responseObject class]);
         return;
     

另外,我很确定您收到的是 NSString,因为在将 NSDictionary 分配给 NSString 时不会出错

【讨论】:

【参考方案2】:

Webservice 响应数据“数据”应该是 NSDictionary,但在您的情况下,您得到的是 NSString。对于 NSString 类,没有可用的 allKeys 方法,这就是你崩溃的原因。一件事是验证 NSDictionary 之类的。

if (data && [data isKindOfClass:[NSDictionary class]]) 

NSLog(@"KEY %@ - VALUE %@",data.allKeys,data.allValues); //Error because i am performing .allKeys on type NSString
NSString *str = data; // error because i am assigning NSDictionary to string

或者删除 NSLog

【讨论】:

以上是关于错误:无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

如何解决此“无法识别的选择器发送到实例”错误?

错误:无法识别的选择器发送到实例

NSKeyedArchiver - 无法识别的选择器发送到实例错误

iPhone:“无法识别的选择器已发送到实例”错误

NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器

快速代码崩溃:“发送到实例的无法识别的选择器”