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
}
}
我收到如下 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
}
}