iOS - 为什么这个 NSString 比较失败了?
iOS - Why does this NSString comparison blow-up?
我已经查看过类似的问题,但我愿意接受重复的问题。
我从一个站点收到一些 JSON,我想测试 404 响应。
我有这样的表达:
NSString *responseString = [json objectForKey:@"statusCode"];
NSLog(@"responseString: %@", responseString);
NSString *myString1 = @"404";
NSLog(@"%d", (responseString == myString1)); //0
NSLog(@"%d", [responseString isEqual:myString1]); //0
NSLog(@"%d", [responseString isEqualToString:myString1]); //Crash
响应字符串returns 404。
第一个和第二个日志结果为 0,第三个日志崩溃:
[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xb000000000001943
2015-01-29 16:23:33.302 Metro[19057:5064427] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xb000000000001943'
statusCode
是数字,不是字符串。该错误通过告诉您您正在尝试在 NSNumber
.
上调用 isEqualToString
来明确这一点
试试这个:
NSInteger responseCode = [json[@"statusCode"] integerValue];
NSInteger notFoundCode = 404;
if (responseCode == notFoundCode) {
// process 404 error
}
您将 responseString
声明为 NSString
的事实并不能保证 [json objectForKey:@"statusCode"]
确实会 return 一个 NSString
对象。
实际上,JSON 解析器在您的 JSON 数据中检测到一个整数,因此,return 编辑了一个 NSNumber
。因此,您应该能够使用 integerValue
针对普通 404
文字对其进行测试,或者,如果您想继续使用字符串,则需要先使用 stringValue
对其进行转换。
无论如何,试试这个,它应该 return 1
:
NSNumber *response = [json objectForKey:@"statusCode"];
...
NSLog(@"%d", [response integerValue] == 404);
我已经查看过类似的问题,但我愿意接受重复的问题。
我从一个站点收到一些 JSON,我想测试 404 响应。
我有这样的表达:
NSString *responseString = [json objectForKey:@"statusCode"];
NSLog(@"responseString: %@", responseString);
NSString *myString1 = @"404";
NSLog(@"%d", (responseString == myString1)); //0
NSLog(@"%d", [responseString isEqual:myString1]); //0
NSLog(@"%d", [responseString isEqualToString:myString1]); //Crash
响应字符串returns 404。 第一个和第二个日志结果为 0,第三个日志崩溃:
[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xb000000000001943
2015-01-29 16:23:33.302 Metro[19057:5064427] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0xb000000000001943'
statusCode
是数字,不是字符串。该错误通过告诉您您正在尝试在 NSNumber
.
isEqualToString
来明确这一点
试试这个:
NSInteger responseCode = [json[@"statusCode"] integerValue];
NSInteger notFoundCode = 404;
if (responseCode == notFoundCode) {
// process 404 error
}
您将 responseString
声明为 NSString
的事实并不能保证 [json objectForKey:@"statusCode"]
确实会 return 一个 NSString
对象。
实际上,JSON 解析器在您的 JSON 数据中检测到一个整数,因此,return 编辑了一个 NSNumber
。因此,您应该能够使用 integerValue
针对普通 404
文字对其进行测试,或者,如果您想继续使用字符串,则需要先使用 stringValue
对其进行转换。
无论如何,试试这个,它应该 return 1
:
NSNumber *response = [json objectForKey:@"statusCode"];
...
NSLog(@"%d", [response integerValue] == 404);