NSDictionary objectForKey 运行时错误的 stringValue

Posted

技术标签:

【中文标题】NSDictionary objectForKey 运行时错误的 stringValue【英文标题】:stringValue of NSDictionary objectForKey runtime error 【发布时间】:2013-06-08 04:08:26 【问题描述】:

所以我有以下代码导致 XCode 中出现运行时错误

NSString* temp = [[param objectforkey@"firstParam"] stringValue];
int tempNum = [[param objectforkey@"secondParam"] intValue];

参数从 plist 加载。 firstParam 为字符串,secondParam 为数字

第一行使程序崩溃。

现在有趣的是,如果我做一个硬种姓,它就会起作用,即:

NSString* temp = (NSString*)[param objectforkey@"firstParam"];
int tempNum = [[param objectforkey@"secondParam"] intValue];

只是想知道为什么 id 会有不一致的实现,因为我必须使用 intValue 转换为 int,但必须进行硬转换才能获得 NSString?为什么不是 stringValue?

【问题讨论】:

【参考方案1】:

您对objectForKey 的第一次调用会返回一个NSString 对象。 NSString 没有 stringValue 方法,这就是生成运行时错误的原因。获取已经是字符串的东西的stringValue 是没有意义的。

objectForKey 的第二次调用返回NSNumberNSNumber 确实有一个 intValue 方法,所以它不会导致错误。

在第二种情况下,您将返回值的类型从 NSNumber 更改为 int。在第一种情况下,返回的对象已经是 NSString,尝试获取字符串的 stringValue 是没有意义的。

【讨论】:

嗯,当我不能确定返回值是NSString 时怎么办?我认为stringValue 将等同于java 的toString,因此始终可用。 如果您不确定要从集合中检索的对象类型,则必须在调用适当的方法之前检查对象以查看其类型。【参考方案2】:

调用[param objectforkey@"firstParam"] 确实返回一个NSString,所以不需要调用stringValue。此外,NSString 没有名为“stringValue”的方法,所以这就是问题的根源。

只需拨打此电话:NSString *temp = (NSString *)[param objectForKey:@"firstParam"];

还要注意选择器是 objectForKey:,而不是 objectforkey:(大写很重要)。

而且,回答你的问题,NSNumber 是一个类,所以任何对象都不是“int”,而是一个 NSNumber 指针。 intValue 返回一个实际的“int”,因为 floatValue 返回一个“float”(NSNumber 可以表示任何类型的数字)。在不需要 NSString 的情况下,因为只有一种类型的 NSString(但是,有一个返回 const char * 的方法,并且可以像 char *string = [[param objectForKey:@"firstParam"] cString]; 一样使用......对于目标不是很有用-C 应用程序)。

【讨论】:

谢谢亚历杭德罗。感谢为 cString 添加的解释。【参考方案3】:

假设您调用了一个返回 JSON 的 Web 服务

然后你处理数据

 NSDictionary *json_response = [NSJSONSerialization JSONObjectWithData:data
                                                                 options:0
                                                                 error:NULL];

现在你尝试这样的事情

 NSString *name = [[object objectForKey:@"Name"] stringValue];

然后你得到错误....

正如mttrb 提到的,由于 stringValue,objectForKey 默认返回值是 String,因此在这种情况下可能的解决方法是:

NSString *name = [object objectForKey:@"Name"];

希望这能暗示一些人!

【讨论】:

【参考方案4】:

如果你不能确定返回的值是NSString,你应该这样做:

id value = [param objectForKey@"firstParam"];

if ([value isKindOfClass:[NSString class]]) 
   NSString *temp = (NSString *)id;
   //Handle string

else 
  //Handle other case
 

【讨论】:

【参考方案5】:

完成@Torge 的回答后,我添加了我的解决方案以始终从 objectForKey 方法获取 NSString:

NSObject * value = [param objectForKey@"firstParam"];
NSString *stringValue;
if ([value isKindOfClass:[NSString class]]) 
   //Handle string
   stringValue = (NSString *)value;


else if([value isKindOfClass:[NSNumber class]])
    //Handle NSNumber
    stringValue = [((NSNumber *) value) stringValue];


else 
    //Handle other case
 

【讨论】:

以上是关于NSDictionary objectForKey 运行时错误的 stringValue的主要内容,如果未能解决你的问题,请参考以下文章

NSDictionary objectForKey 随机回答

NSDictionary objectForKey 运行时错误的 stringValue

使用 objectForKey 返回错误类型的键

十二:objectForKey与valueForKey区别简单分析

Swift 从 NSDictionary 读取数据

NSDictionary全部API的学习。