What is the difference between isEqual:
and isEqualToString:
?
Why are classes adding isEqualTo* methods (isEqualToArray for NSArray, isEqua
Expanding on @Abizern and @Jonathan Dann answers, both isEqual
and isEqualToString
work with nil
values.
- (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");
}
I highly recommend this. The performance benefits of isEqualToString are basically negligible for most applications. But there are two other distinctions the author mentions:
nil
is handledAlso, for writing your own -isEqual:
and -isEqualTo<Class>:
methods, the convention is to allow nil arguments for -isEqual:
and raise an exception for nil arguments to -isEqualTo<Class>:
isEqual:
compares a string to an object, and will return NO
if the object is not a string. isEqualToString:
is faster if you know both objects are strings, as the documentation states:
Special Considerations
When you know both objects are strings, this method is a faster way to check equality than
isEqual:
.
isEqualTo<Class>
is used to provide specific checks for equality. For instance; isEqualToArray: checks that the arrays contain an equal number of objects, and that the objects at a given index return YES
for the isEqual:
test.
My guess is that it provides a slight performance enhancement, as isEqualToString: won't have to type-check what's passed in.