【问题标题】:[NSNull isEqualToString:]: unrecognized selector sent to instance[NSNull isEqualToString:]:无法识别的选择器发送到实例
【发布时间】:2011-08-23 09:01:15
【问题描述】:

尝试比较 web 服务返回的字段,其中仅包含字符串 truefalse(是的,它是字符串而不是布尔值),所以我尝试将它与另一个字符串进行比较,如下所示:

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 始终是一个字符串。抛出此错误时,withOptionsNSNull 的一个实例。有两个可能的原因:您正在从可能返回 +[NSNull null] 的方法中检索 withOptions,例如表示未找到,或者您已损坏内存并且所有赌注都已关闭。
  • 嗨,你能解释一下你的第二个原因吗?谢谢
  • 这意味着您在某处过度释放了一个对象,并且在同一地址分配了一个新对象(不同类型的对象)。但是,这不可能是正在发生的事情,因为+null 返回一个在应用程序生命周期的早期分配的单例。巴里的第一个原因很可能是它。
  • 这是一个长镜头,但内存损坏(例如,老式 C 风格的数组溢出)是否会将 NSNull 类的地址写入 withOptionsisa

标签: objective-c cocoa ios


【解决方案1】:

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

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

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

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

当崩溃发生时,withOptions 指的是NSNull 的一个实例。

【讨论】:

  • 嗨,我已经考虑过了,我测试了字符串withOptions的类,在日志中我得到了NSCFString,这就是为什么我会考虑巴里的第二个原因:)跨度>
  • 不可能withOptionsif() 语句之前的行上是NSCFString 类型,然后在if() 语句中崩溃,因为它变成了NSNull。它仍然可能是内存损坏,但底线是 withOptions 包含对 NSNull 的引用,如果 if() 语句是实际崩溃发生的位置。
  • 嗨,我尝试跟踪错误,发现问题可能不是来自 isEqual 函数,请在这里查看我的新帖子,我已经解释了我的问题,谢谢:stackoverflow.com/questions/5970981/…
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 2011-10-16
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      相关资源
      最近更新 更多