Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c [NSNull isEqualToString:]:发送到实例的选择器无法识别_Objective C_Cocoa_Ios - Fatal编程技术网

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

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

尝试比较web服务返回的字段,该字段只包含字符串
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解释了我的问题: