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

时间:2016-03-18 05:35:02

标签: ios objective-c

我遇到了类似的问题,但无法解决我的问题。 问题是我调用了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);
     }
}];

这两条错误信息是否相互矛盾?关于这个问题的任何解释。谢谢。

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

第二个NSLog给出了这个:不兼容的指针类型,用类型为NSDictionary *的表达式初始化NSString * (这在键入后显示,我不知道这种类型的错误被称为:D)

2 个答案:

答案 0 :(得分:0)

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

例如

     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时没有收到错误

答案 1 :(得分:0)

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