【发布时间】:2010-09-18 10:19:15
【问题描述】:
我在 SO 上看到了几个问题,其中包括函数 isEqual: 而不是标准的 ==。
到目前为止,我只学会了使用==,所以我想知道哪个更好用,各有什么优缺点?你应该什么时候使用它们?
谢谢。
【问题讨论】:
标签: iphone objective-c comparison equality equals-operator
我在 SO 上看到了几个问题,其中包括函数 isEqual: 而不是标准的 ==。
到目前为止,我只学会了使用==,所以我想知道哪个更好用,各有什么优缺点?你应该什么时候使用它们?
谢谢。
【问题讨论】:
标签: iphone objective-c comparison equality equals-operator
他们做不同的事情;所以你需要使用合适的:
考虑一下,如果你愿意:
NSString *a = @"Hello!";
NSString *b = a;
NSString *c = [a mutableCopy];
if (a == b) NSLog(@"This prints");
if (b == c) NSLog(@"This doesn't");
if ([a isEqual:c]) NSLog(@"This does");
换句话说; == 只检查两个指针是否指向同一个地方,因此是同一个对象; isEqual: 检查两个对象是否相等;在这种情况下a 和b 是同一个字符串,而c 是一个等于a 的新字符串,因为它具有相同顺序的相同字符;但它有不同的类和不同的地址。
您几乎总是希望将isEqual: 用于对象,并且如果它们有它,如果它们属于同一类(例如isEqualToString:),则使用更具体的比较器。
== 另一方面,您可能应该只用于整数数据类型。 (它们对对象意义不大,对浮点数意义不大。)
【讨论】:
[a copy] 可能返回相同的对象,因为它是不可变的字符串。
isEqual 可以为真(两个相同的对象),而== 为假(指向内存中两个相同对象所在的不同位置)。另一方面,如果== 为真,那么isEqual 就不可能为假?
[SQLNull sharedNull] == [SQLNull sharedNull] 为真,[[SQLNull sharedNull] isEqual:[SQLNull sharedNull]] 也会给出假,因为在我们假定的 SQLNull 类中,- (BOOL)isEqual:(id)b { return NO; }
isEqual 将根据为接收者对象编写的方法比较对象
== 比较对象的地址(或它们的值对于 C 类型变量,如 ints)
这意味着 NSStrings == 比较地址,但 isEquals: 将查看字符串对象的值,因此类似于 strcmp 的操作
请注意,许多字符串都被保留,因此如果它们的数据相同,它们的地址也相同,因此 == 可以在测试用例中工作。
【讨论】: