了解NSString比较

Yar*_*rin 82 cocoa objective-c string-comparison nsstring

以下比较均评估为真:

1)

@"foo" == @"foo";
Run Code Online (Sandbox Code Playgroud)

2)

NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
myString1 == myString2;
Run Code Online (Sandbox Code Playgroud)

但是,肯定有时候NSString使用等于运算符无法比较两个s,[myString1 isEqualToString:myString2]而是需要它.有人可以对此有所了解吗?

Jac*_*kin 162

之所以==奏效是因为指针比较.当你定义一个恒定的NSString使用@"",编译器uniquifies参考.当在代码中的其他位置定义相同的常量时,它们都将指向内存中的相同实际位置.

比较NSString实例时,您应该使用以下isEqualToString:方法:

NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
NSLog(@"%d", (myString2 == myString3))  //0
NSLog(@"%d", (myString1 == myString2)); //1
NSLog(@"%d", [myString1 isEqualToString:myString2]); //1
NSLog(@"%d", [myString1 isEqualToString:myString3]); //1
[myString3 release];
Run Code Online (Sandbox Code Playgroud)

编辑:

NSString *myString3 = [[NSString alloc] initWithString:@"foo"]; 
// this is same with @"foo"
Run Code Online (Sandbox Code Playgroud)

initWithString:不再创建新的参考,你需要initWithFormat,

NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
Run Code Online (Sandbox Code Playgroud)

  • 大多数编译器也会将`myString3`指向常量`"foo"`作为优化,因此通常,所有这三个变量都将指向相同的内存位置.这对于gcc和clang都是如此(使用默认选项).尝试编译:http://gist.github.com/578568 (6认同)
  • +1,只是添加:`isEqual:`实际上做了一个完整的字符串比较并返回与`isEqualToString`相同的结果,因为_NSObject Protocol Reference_和_NSString Class Reference_明确指定(分别):"如果两个对象相等(通过`-isEqual:`)它们必须具有相同的散列值"AND"如果两个字符串对象相等(由isEqualToString:方法确定),它们必须具有相同的散列值." (2认同)

Dav*_* M. 13

等号运算符==仅比较指针地址.使用文字@""语法创建两个相同的字符串时,编译器将检测它们是否相等,并且只存储一次数据.因此,两个指针指向同一位置.但是,由其他方法创建的字符串可能包含相同的数据,但存储在不同的存储位置.因此,在比较字符串时应始终使用isEqual:.

请注意,isEqual:isEqualToString:始终返回相同的值,但isEqualToString:速度更快.

  • 另请注意,`isEqualToString`:如果传递给它的参数是`nil`,将导致异常.所以如果你有可能比较一个nil字符串,你应该先做一个nil检查或者使用`isEqual:` (2认同)

mip*_*adi 10

==比较内存中的位置.ptr == ptr2如果它们都指向相同的内存位置.这恰好适用于字符串常量,因为编译器碰巧使用一个实际字符串来表示相同的字符串常量.它不会,如果你有相同的内容变量的工作,因为他们会指向不同的内存位置; 使用isEqualToString在这样的情况下.


Nik*_*uhe 6

在Cocoa中,使用NSString的isEqualToString:方法比较字符串.

指针比较适用于您的情况,因为编译器足够温和,可以将两个字符串文字合并为一个对象.无法保证两个相同的字符串共享一个NSString实例.