NSString:isEqual与isEqualToString


94

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

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

Answers:


103

isEqual:比较字符串和对象,NO如果对象不是字符串,则返回。isEqualToString:如果您知道两个对象都是字符串,则速度会更快,如文档所述:

特别注意事项

当您知道两个对象都是字符串时,此方法是一种比更快的检查相等性的方法isEqual:

isEqualTo<Class>用于提供对相等性的特定检查。例如; isEqualToArray:检查该阵列包含对象的数目相等,并在给定的索引返回的对象YESisEqual:试验。


3
如果您相信Aaron Hillegass,那么在性能上就没有区别,只需要一点点安全性即可:blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro

2
感谢您的链接-有用。虽然您要我们相信Mark Dalrymple-我是谁:)
Abizern 2014年


16

另外,为了编写自己的-isEqual:-isEqualTo<Class>:方法,约定是允许使用nil个参数,-isEqual:并为nil个参数引发异常。-isEqualTo<Class>:


1
我以前没有遇到过,您知道什么文档吗?
Mike Abdullah

2
对于isEqualToString似乎并非如此,如果您传入nil,它只会返回NO。
2009年

9
有趣的是,它记录在< ahref=" developer.apple.com/documentation/Cocoa/Conceptual/…基础知识指南</a>
乔纳森·丹

这不是真的。isEqualToString不会引发异常。
尊重TheCode 2013年

1
可可基础指南网页上说:“本文档可能不代表当前开发的最佳实践。” 很老了。
cbh2000

5

我的猜测是,它提供了稍微的性能增强,因为isEqualToString:不必类型检查传入的内容。


您的猜测可能是正确的:)
Philip007

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

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

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

我认为两者处理nil的方式没有任何区别。接收者或参数或两者都不为零。
SayeedHussain 2014年

无论“此”如何不再存在:/
Jared Grubb

1
谢谢@JaredGrubb,我找到了新的URL。
本·帕卡德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.