iOS - 为什么这个NSString比较爆炸?

时间:2015-01-29 21:31:28

标签: ios objective-c json response

我已经看过类似问题的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'

2 个答案:

答案 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);