【发布时间】:2016-03-18 05:35:01
【问题描述】:
我遇到过类似的问题,但无法解决我的问题。
问题是我调用了 API,我将响应存储在 NSDictionary 中,响应是单个值,例如 RED 或 GREEN:
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一样信任你,所以如果你说
data是NSDictionary *那么它不会在编译时抱怨如果您使用NSDictionary消息,例如allKeys。当您尝试将其分配给NSString *时,它确实会抱怨,因为您说它是一本字典。现在,在运行时,如果您将NSString *传递给此方法(这就是您正在执行的操作),那么当您尝试将其视为字典时,您将得到一个异常,因为它不是一个!因此,您可以更改传递给此方法的内容,也可以更改参数类型
标签: ios objective-c