使用 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 个指针都指向相同的内存位置,因此在通过 == 比较时彼此相等。
这可能有点长,但我试图让它易于理解和理解。希望对您有所帮助。