【问题标题】:comparison of two strings fails两个字符串的比较失败
【发布时间】:2012-02-17 03:27:03
【问题描述】:

我比较了两个明显相同的字符串。不幸的是,我的 if 子句没有按预期工作:

NSLog(@"%@ == %@ ?",strippedString1,strippedString2);

if (strippedString1 == strippedString2) {
    [_newBuild setTextColor: [NSColor greenColor] ]; 
    [_OldBuild setTextColor: [NSColor greenColor] ]; 
}

这是我的 NSLog 输出:Build: 2A12-046 == Build: 2A12

即使是逐字节比较也表明两个字符串是相同的:

有什么线索吗?

【问题讨论】:

    标签: objective-c string comparison


    【解决方案1】:

    使用==,您正在比较指针地址,以比较您可以使用的字符串的内容:

     [strippedString1 isEqualToString: strippedString2];
    

    【讨论】:

    • 除此之外,您还会在编译器中获得常量折叠,因此有时== 比较似乎神奇地起作用,然后有时会失败,具体取决于字符串的定义位置和您使用的编译器设置。
    • @MichaelAnderson: 哇...所以如果我想检查两个对象是否相同(具有相同的地址),我可以结束比较它们的内容吗?
    • 我想说的是:const NSString s1 = @"hello"; ... NSString s2 = s1; ... if( s2 == @"hello" ) { ... } 可能通过或失败取决于编译器设置。 == 永远不会比较内容,只会比较位置,但有时该位置可能是相同的,而您可能没想到。我认为编译器只折叠字符串/基本类型常量,而不是一般对象常量,但我不确定这是否是强制性的——我当然永远不会依赖它。
    【解决方案2】:

    我认为对于 String,您应该使用(这是 Java).equals() 或等效项。

    【讨论】:

      【解决方案3】:

      您不能使用 == 运算符比较两个 NSString,而是使用

      [strippedString1 isEqualToString:strippedString2];
      

      【讨论】:

        【解决方案4】:

        重要部分:你的意思是使用isEqualToString

        使用 == 将检查指针的相等性,即它会告诉您正在比较的两个对象是否实际上是同一个实例。

        相反,我认为您的意思是检查内容是否相同,但根据 appledocs,当您知道这两个对象是字符串时,您会想要使用 isEqualToString,因为它比 isEqual 快得多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-02
          • 1970-01-01
          • 2016-07-05
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多