В чем разница между isEqual:
и isEqualToString:
?
Почему классы добавляют методы isEqualTo* (isEqualToArray для NSArray, isEqualToData для NSData,...) вместо того, чтобы просто переопределять isEqual:
?
В чем разница между isEqual:
и isEqualToString:
?
Почему классы добавляют методы isEqualTo* (isEqualToArray для NSArray, isEqualToData для NSData,...) вместо того, чтобы просто переопределять isEqual:
?
isEqual:
сравнивает строку с объектом и возвращает NO
, если объект не является строкой. isEqualToString:
быстрее, если вы знаете, что оба объекта являются строками, как документация гласит:
Особые соображения
Когда вы знаете, что оба объекта являются строками, этот метод является более быстрым способом проверки равенства, чем
isEqual:
.
isEqualTo<Class>
используется для специальных проверок на равенство. Например; isEqualToArray:
проверяет, что массивы содержат одинаковое количество объектов и что объекты с заданным индексом возвращают YES
для проверки isEqual:
.
Кроме того, для написания собственных методов -isEqual:
и -isEqualTo<Class>:
соглашение состоит в том, чтобы разрешить нулевые аргументы для -isEqual:
и создать исключение для нулевых аргументов для -isEqualTo<Class>:
.
Я предполагаю, что это обеспечивает небольшое повышение производительности, так как 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");
}
Я настоятельно рекомендую это. Преимущества isEqualToString в производительности в большинстве приложений незначительны. Но есть еще два отличия, о которых упоминает автор:
nil