NSString:isEqual vs. isEqualToString

时间:2009-08-18 09:34:40

标签: objective-c iphone cocoa nsstring

isEqual:isEqualToString:之间的区别是什么?

为什么类添加isEqualTo *方法(NSArray的isEqualToArray,NSData的isEqualToData,...)而不是仅覆盖isEqual:

5 个答案:

答案 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答案,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");
}

答案 4 :(得分:3)

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

  • 类型安全
  • 处理nil的方式