NSDictionary 获取值作为字符串不抱怨但 lenngth 或 isEqualToString 崩溃

NSDictionary get value as string does not complain but lenngth or isEqualToString crashes

我收到如下 Json 作为回复消息。

data:{
    type = DATA;
    version = "4.51";
}

我在下面的方法中处理的,从调试器看来版本号是字符串。

-(void)processResponse:(NSDictionary *)responseDictionary{
    NSString *version = [responseDictionary valueForKey:@"version"];
    if([version isEqualToString:@"4.51"]){ //line 3
        NSLog(@"do something"); //crashes
    }
}

但是第 3 行崩溃了。 我的问题是为什么这条线会崩溃?处理此类字典消息的最佳方式是什么?

如果这是源自您的程序之外的数据,您必须始终检查类型。

-(void)processResponse:(NSDictionary *)responseDictionary {
    id value = responseDictionary[@"version"];
    if ([value isKindOfClass: [NSString class]]) {
        NSString *version = value;
        if ([version isEqualToString: @"4.51"]) {
            NSLog(@"do something"); //crashes
        }
    }
}

如果这就是您要做的全部,那么您可以通过 && 短路将其缩短一点,如果您小心的话。

-(void)processResponse:(NSDictionary *)responseDictionary {
    NSString *version = responseDictionary[@"version"];
    if ([version isKindOfClass: [NSString class]] 
        && [version isEqualToString: @"4.51"]) {

        NSLog(@"do something"); //crashes
    }
}

对此要非常小心,因为这意味着 version 存在于此 if 块之外并且可能不是正确的类型。

同样,如果这正是您的问题,您也可以使用 isEqual: 来简化它,它适用于所有 NSObject:

-(void)processResponse:(NSDictionary *)responseDictionary {
    id version = responseDictionary[@"version"];
    if ([version isEqual: @"4.51"]) {
        NSLog(@"do something"); //crashes
    }
}