isEqual:
和isEqualToString:
之间的区别是什么?
为什么类添加isEqualTo *方法(NSArray的isEqualToArray,NSData的isEqualToData,...)而不是仅覆盖isEqual:
?
答案 0 :(得分:100)
isEqual:
将字符串与对象进行比较,如果对象不是字符串,则返回NO
。如果您知道两个对象都是字符串,则isEqualToString:
会更快,因为documentation表示:
特别注意事项
当您知道两个对象都是字符串时,此方法比
isEqual:
更快速地检查相等性。
isEqualTo<Class>
用于提供相等的特定检查。例如; isEqualToArray:
检查数组是否包含相同数量的对象,并且给定索引处的对象返回YES
isEqual:
测试。
答案 1 :(得分:15)
另外,对于编写自己的-isEqual:
和-isEqualTo<Class>:
方法,约定是允许-isEqual:
的nil参数,并为-isEqualTo<Class>:
的nil参数引发异常
答案 2 :(得分:5)
我的猜测是它提供了轻微的性能增强,因为isEqualToString:不必输入 - 检查传入的内容。
答案 3 :(得分:5)
扩展@Abizern和@Jonathan Dann答案,isEqual
和isEqualToString
都使用nil
值。
- (void)testStringEqual {
NSString *string = nil;
STAssertFalse([string isEqual:@"test"], @"NSString isEqual");
STAssertFalse([string isEqualToString:@"test"], @"NSString isEqualToString");
// Note that these both return NO
STAssertFalse([string isEqual:nil], @"NSString isEqual");
STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
string = @"test";
STAssertTrue([string isEqual:@"test"], @"NSString isEqual");
STAssertTrue([string isEqualToString:@"test"], @"NSString isEqualToString");
STAssertFalse([string isEqual:nil], @"NSString isEqual");
STAssertFalse([string isEqualToString:nil], @"NSString isEqualToString");
}
答案 4 :(得分:3)
我强烈推荐this。对于大多数应用程序,isEqualToString的性能优势基本上可以忽略不计。但是作者提到了另外两个区别:
nil
的方式