【发布时间】:2011-08-23 09:01:15
【问题描述】:
尝试比较 web 服务返回的字段,其中仅包含字符串 true 或 false(是的,它是字符串而不是布尔值),所以我尝试将它与另一个字符串进行比较,如下所示:
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。
【问题讨论】:
-
您不应该如此确定
withOptions始终是一个字符串。抛出此错误时,withOptions是NSNull的一个实例。有两个可能的原因:您正在从可能返回+[NSNull null]的方法中检索withOptions,例如表示未找到,或者您已损坏内存并且所有赌注都已关闭。 -
嗨,你能解释一下你的第二个原因吗?谢谢
-
这意味着您在某处过度释放了一个对象,并且在同一地址分配了一个新对象(不同类型的对象)。但是,这不可能是正在发生的事情,因为
+null返回一个在应用程序生命周期的早期分配的单例。巴里的第一个原因很可能是它。 -
这是一个长镜头,但内存损坏(例如,老式 C 风格的数组溢出)是否会将 NSNull 类的地址写入
withOptions的isa?
标签: objective-c cocoa ios