NSDictionary objectForKey运行时错误的stringValue

时间:2013-06-08 04:08:27

标签: casting nsstring nsdictionary

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

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

param从plist加载。 firstParam是字符串,secondParam是数字

第一行崩溃了该程序。

现在有趣的是,如果我做了一个艰苦的种姓,那就有用了:

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

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

5 个答案:

答案 0 :(得分:7)

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

第二次调用objectForKey会返回NSNumberNSNumber确实有intValue方法,因此不会导致错误。

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

答案 1 :(得分:6)

调用[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];一样使用...无论如何,对Objective-C应用程序非常有用。)

答案 2 :(得分:2)

假设您调用返回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"];

希望这暗示一些人!

答案 3 :(得分:1)

如果您无法确定返回的值是否为NSString,则应执行此操作:

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

if ([value isKindOfClass:[NSString class]]) {
   NSString *temp = (NSString *)id;
   //Handle string
}
else {
  //Handle other case
} 

答案 4 :(得分:0)

完成@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
}