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