[NSNull isEqualToString:]:无法识别的选择器发送到实例

时间:2011-05-11 14:23:01

标签: objective-c cocoa ios

尝试比较web-service返回的字段,它只包含字符串truefalse(YES,它是STRING而不是boolean),所以我尝试将它与另一个字符串进行比较像这样:

if ([withOptions isEqualToString:@"true"]) {
               annotation.stationLavage=@"with";
           }else {
               annotation.stationLavage=@"without";
           }

所以当withOptions字符串包含“true”字符串时,一切正常,当它包含“false”字符串时,我在日志中得到了这个异常:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x2984d68'

我很确定在所有情况下,withOptions都包含一个字符串值(“true”或“false”),它永远不会包含NULL。

3 个答案:

答案 0 :(得分:3)

  

我很确定在所有情况下,   withOptions包含字符串值   (“真”或“假”)和它   永远不会包含NULL。

显然,这种假设是错误的。 :)

if()语句之前的行上,添加NSLog(@"%@ - %@", withOptions, [withOptions class]);

不是NSNullNULL不是一回事; NSNull是一个类,其单例实例在容器(和其他东西)中表示“无值”,不接受nil作为值。

发生崩溃时,withOptions指的是NSNull

的实例

答案 1 :(得分:0)

这是我的代码,易于理解。

if ([[info objectForKey:@"address"] isKindOfClass:[NSNull class]]) {
            dto.address    =   @"Unknown";
}

答案 2 :(得分:0)

如果你想做一个安全的比较而且你的“withOption”不是100%包含一个字符串,因为它可能是例如null(没有给出选项的情况)你可以这样做:

if ([@"true" isEqualToString:withAnnotation]) {
     annotation.stationLavage=@"with";
 }else {
     annotation.stationLavage=@"without";
 }

请注意,您甚至可以缩短比较数据:

annotation.stationLavage=[@"true" isEqualToString:withAnnotation]?@"with":@"without";