【问题标题】:NS String comparison fails with stringWithFormatNS 字符串比较因 stringWithFormat 而失败
【发布时间】:2009-11-23 15:11:05
【问题描述】:

我有两个值相同的 NSStrings

这对我来说失败了:

if (button.controlName == controlName) {
        return button;
    }

这行得通:

if ([button.controlName compare: controlName] == NSOrderedSame) {
        return button;
    }

这就是在目标 c 中比较字符串的方式吗?还是第一个语句也应该起作用?为什么第一个语句可能失败?我知道它适用于其他字符串。

它不起作用的字符串是这样初始化的:

button.controlName = [NSString stringWithFormat:@"controlName%d", i]

【问题讨论】:

  • 它对其他字符串不起作用,它只是看起来起作用。即使在 C 中,你也不能用 == 比较两个字符串(必须使用 strcmp 或类似的)。

标签: iphone objective-c nsstring


【解决方案1】:

使用 NSString 你应该使用isEqualToString: 而不是比较。

[button.controlName isEqualToString:controlName]

阅读更多原因(以及为什么它适用于其他一些字符串)

Objective-C 是标准 C 之上的一个相当薄的层。因此 obj-c 就像在普通 c 中一样,没有运算符重载。

NSString *controlName = @"bobDole";

上面的代码创建了一个指向字符串@"bobDole"的指针,controlName不是值本身,而是一个长整数,表示一个对象的内存地址。

当使用指针并使用== 运算符比较它们时(mutableCopy 被用于防止编译器优化此示例的有效性。)

NSString *string1 = @"bobDole";
NSString *string2 = [string1 mutableCopy];

NSLog(@"%d", string1 == string2);

即使两个对象都是 NSStrings,并且都包含 @"bobDole" 的值,上面的代码将始终打印 false(或在这种情况下为零)。这是因为 string1 的值实际上是一个像 0x0123456 这样的十六进制数字,而 string2 可能是像 0x0987654 这样的数字。所以上面的比较在计算机上看起来是这样的:

NSLog(@"%d", 0x0123456 == 0x0987654);

因此,在比较字符串(或任何其他对象)时,请始终使用isEqual 方法之一,切勿使用== 运算符。

现在说说为什么它适用于其他一些字符串:

如上所述,当使用== 运算符时,您实际上是在进行指针比较。您还会注意到,在上面的示例中,我使用了 mutableCopy 而不是以下内容:

NSString *string1 = @"bobDole";
NSString *string2 = @"bobDole";

我这样做的原因是编译器会查看这两个语句,知道它们共享相同的不可变值并优化它们,使它们指向内存中的相同值。从而使两者的指针值相同。

编译器也会对这些字符串初始化方法进行同样的优化。

NSString *string3 = [NSString stringWithString:@"bobDole"];
NSString *string4 = [NSString stringWithString:string1];
NSString *string5 = [string1 copy];  

由于编译器和运行时的这种优化,所有 5 个指针都指向相同的内存位置,因此在通过 == 比较时彼此相等。

这可能有点长,但我试图让它易于理解和理解。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    第一个语句只比较指针,而不是字符串值,因此要比较字符串,您应该使用 -isEqualToString 作为 Bryan 点。

    【讨论】:

      【解决方案3】:

      有一个名为isEqualToString 的方法可以比较两个 NSString。

      if([button.controlName isEqualToString:controlName])
         ...
      

      【讨论】:

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