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