【发布时间】:2010-11-20 13:00:04
【问题描述】:
isEqual: 和 isEqualToString: 有什么区别?
为什么类要添加 isEqualTo* 方法(isEqualToArray 用于 NSArray,isEqualToData 用于 NSData,...)而不是仅仅覆盖 isEqual:?
【问题讨论】:
标签: objective-c iphone cocoa nsstring
isEqual: 和 isEqualToString: 有什么区别?
为什么类要添加 isEqualTo* 方法(isEqualToArray 用于 NSArray,isEqualToData 用于 NSData,...)而不是仅仅覆盖 isEqual:?
【问题讨论】:
标签: objective-c iphone cocoa nsstring
isEqual: 将字符串与对象进行比较,如果对象不是字符串,则返回 NO。如果您知道两个对象都是字符串,isEqualToString: 会更快,正如documentation 所述:
特殊注意事项
当您知道两个对象都是字符串时,此方法是一种比
isEqual:更快的检查相等性的方法。
isEqualTo<Class> 用于提供特定的相等性检查。例如; isEqualToArray: 检查数组是否包含相同数量的对象,以及给定索引处的对象是否为 isEqual: 测试返回 YES。
【讨论】:
另外,对于编写自己的 -isEqual: 和 -isEqualTo<Class>: 方法,约定是允许 -isEqual: 使用 nil 参数,并为 -isEqualTo<Class>: 引发 nil 参数异常
【讨论】:
我的猜测是它提供了轻微的性能增强,因为 isEqualToString: 不必对传入的内容进行类型检查。
【讨论】:
扩展 @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");
}
【讨论】:
我强烈推荐this。对于大多数应用程序来说,isEqualToString 的性能优势基本上可以忽略不计。但作者还提到了另外两个区别:
nil 的处理方式【讨论】: