Objective c [NSNull isEqualToString:]:发送到实例的选择器无法识别
尝试比较web服务返回的字段,该字段只包含字符串Objective c [NSNull isEqualToString:]:发送到实例的选择器无法识别,objective-c,cocoa,ios,Objective C,Cocoa,Ios,尝试比较web服务返回的字段,该字段只包含字符串true或false(是的,它是字符串而不是布尔值),因此我尝试将其与另一个字符串进行比较,如下所示: if ([withOptions isEqualToString:@"true"]) { annotation.stationLavage=@"with"; }else { annotation.stationLavage=@"without";
true
或false
(是的,它是字符串而不是布尔值),因此我尝试将其与另一个字符串进行比较,如下所示:
if ([withOptions isEqualToString:@"true"]) {
annotation.stationLavage=@"with";
}else {
annotation.stationLavage=@"without";
}
所以当withOptions
string包含“true”字符串时,一切正常,当它包含“false”字符串时,我在日志中得到了这个异常:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x2984d68'
我非常确定,在所有情况下,withOptions
都包含字符串值(“true”或“false”),并且从不包含NULL
我敢肯定,在所有情况下,
withOptions包含一个字符串值
(无论是“真”还是“假”)并且
从不包含NULL
显然,这种假设是错误的
在if()
语句前面的行中,添加NSLog(@“%@-%@”,withOptions,[withOptions类])代码>
不是说NSNull
和NULL
不是一回事NSNull
是一个类,其单例实例在不接受nil
作为值的容器(和其他东西)中表示“无值”
当崩溃发生时,withOptions
指的是NSNull的一个实例
这是我的代码,很容易理解
if ([[info objectForKey:@"address"] isKindOfClass:[NSNull class]]) {
dto.address = @"Unknown";
}
如果您希望进行安全比较,并且您的“withOption”包含字符串的概率不是100%,因为它可能是空的(例如,在没有提供选项的情况下),您可以执行以下操作:
if ([@"true" isEqualToString:withAnnotation]) {
annotation.stationLavage=@"with";
}else {
annotation.stationLavage=@"without";
}
请注意,您甚至可以缩短时间:
annotation.stationLavage=[@"true" isEqualToString:withAnnotation]?@"with":@"without";
您不应该如此确定withOptions
始终是一个字符串<当抛出此错误时,code>withOptions
是NSNull
的一个实例。有两个可能的原因:您正在从一个可能返回+[NSNull null]
的方法中使用选项检索,例如,表示未找到,或者您的内存已损坏,所有赌注都已取消。您好,您能解释一下您的第二个原因吗?thxIt意味着您在某个地方过度释放了一个对象,并在同一地址分配了一个新对象(一个不同类型的对象)。但这不可能发生,因为+null
返回一个在应用生命周期早期分配的单例。Barry的第一个原因很可能是它。这是一个很长的机会,但是内存损坏(例如老式的C型数组溢出)会不会将NSNull类的地址写入的isa
的with options
?嗨,我已经考虑过了,我用options测试了字符串的类,在日志中我得到了NSCFString
,这就是为什么我会想到Barry的第二个原因:)在if()之前的行中,withOptions
的类型不可能是NSCFString
语句,然后在if()
语句中崩溃,因为它变成了NSNull
。这仍然可能是内存损坏,但底线是withOptions
包含对NSNull
的引用,如果if()
语句是实际崩溃发生的地方。您好,我尝试跟踪错误,发现问题可能不是来自isEqual函数,请参阅我的新帖子,我已经提前向thx解释了我的问题: