NSString:isEqual与isEqualToString

isEqual:isEqualToString:之间有什么区别?

为什么类添加isEqualTo *方法(NSArray的isEqualToArray,NSData的isEqualToData,…),而不是只是重写isEqual:

isEqual:将string与对象进行比较,如果对象不是string,则返回NOisEqualToString:如果您知道两个对象都是string,则速度会更快,因为文档指出:

特别注意事项

当你知道这两个对象都是string的时候,这个方法比isEqual:检查等isEqual:更快isEqual:

isEqualTo<Class>用于为相等性提供特定的检查。 例如; isEqualToArray:检查数组是否包含相等数量的对象,并且isEqual: test的给定索引处的对象是否返回YES

此外,为了编写自己的-isEqual:-isEqualTo<Class>:方法,约定是允许nil参数为-isEqual:并为nil参数引发exception为-isEqualTo<Class>:

我的猜测是,它提供了一个轻微的性能增强,isEqualToString:将不必键入检查传入。

在@Abizern和@Jonathan Dann的回答中, isEqualisEqualToString使用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"); } 

我强烈推荐这个 。 对于大多数应用来说,isEqualToString的性能优势基本可以忽略不计。 但作者提到另外两个区别:

  • types安全
  • 处理方式nil