【问题标题】:stringValue of NSDictionary objectForKey runtime errorNSDictionary objectForKey 运行时错误的 stringValue
【发布时间】: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?

【问题讨论】:

    标签: casting nsstring nsdictionary


    【解决方案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
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          • 1970-01-01
          相关资源
          最近更新 更多