4

所以我有以下代码在 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?为什么不是字符串值?

4

5 回答 5

8

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

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

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

于 2013-06-08T04:12:22.080 回答
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 类型(但是,有一个返回 a 的方法const char *,并且会像char *string = [[param objectForKey:@"firstParam"] cString];... 一样使用它,反正对于 Objective-C 应用程序不是很有用)。

于 2013-06-08T04:24:34.920 回答
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"];

希望这能暗示一些人!

于 2016-02-18T01:54:32.233 回答
1

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

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

if ([value isKindOfClass:[NSString class]]) {
   NSString *temp = (NSString *)id;
   //Handle string
}
else {
  //Handle other case
} 
于 2016-06-02T09:39:21.377 回答
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
} 
于 2016-10-14T06:54:15.257 回答