我已经看过类似问题的SO了,但我很乐意被指向重复。
我从网站收到一些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
响应字符串返回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'
答案 0 :(得分:1)
statusCode
是一个数字,而不是字符串。该错误通过告诉您尝试在isEqualToString
上致电NSNumber
来说明这一点。
试试这个:
NSInteger responseCode = [json[@"statusCode"] integerValue];
NSInteger notFoundCode = 404;
if (responseCode == notFoundCode) {
// process 404 error
}
答案 1 :(得分:1)
您将responseString
声明为NSString
这一事实并不能保证[json objectForKey:@"statusCode"]
确实会返回NSString
个对象。
实际上,JSON解析器在您的JSON数据中检测到一个整数,因此返回NSNumber
。因此,您应该能够使用404
针对普通integerValue
字面值进行测试,或者,如果您想继续使用字符串,则需要先使用stringValue
进行转换。
无论如何,试试这个,它应该返回1
:
NSNumber *response = [json objectForKey:@"statusCode"];
...
NSLog(@"%d", [response integerValue] == 404);