等同与等同

isEqual:isEqualToString:有什么不同?

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

43635 次浏览

My guess is that it provides a slight performance enhancement, as isEqualToString: won't have to type-check what's passed in.

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.

Also, 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>:

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:

  • Type safety
  • The way nil is handled