问题描述
以下两个比较结果都为真:
Both the following comparisons evaluate to true:
1)
@"foo" == @"foo";
2)
NSString *myString1 = @"foo";
NSString *myString2 = @"foo";
myString1 == myString2;
但是,肯定有时无法使用相等运算符比较两个 NSString
,而需要 [myString1 isEqualToString:myString2]
代替.有人可以对此有所了解吗?
However, there are definitely times where two NSString
s cannot be compared using the equality operator, and [myString1 isEqualToString:myString2]
is required instead. Can someone shed some light on this?
推荐答案
==
之所以起作用,是因为指针比较.当您使用 @""
定义常量 NSString
时,编译器会统一引用.当在代码的其他地方定义了相同的常量时,它们都将指向内存中的相同实际位置.
The reason why ==
works is because of pointer comparison. When you define a constant NSString
using @""
, the compiler uniquifies the reference. When the same constants are defined in other places in your code, they will all point to the same actual location in memory.
当比较 NSString
实例时,你应该使用 isEqualToString:
方法:
When comparing NSString
instances, you should use the isEqualToString:
method:
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];
NSString *myString3 = [[NSString alloc] initWithString:@"foo"];
// this is same with @"foo"
initWithString:
不再创建新的引用,您将需要 initWithFormat
,
initWithString:
does not create a new reference any more, you will need initWithFormat
,
NSString *myString3 = [[NSString alloc] initWithFormat:@"foo"];
这篇关于理解 NSString 比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!