NSString: isEqual против isEqualToString

В чем разница между isEqual: и isEqualToString:?

Почему классы добавляют методы isEqualTo* (isEqualToArray для NSArray, isEqualToData для NSData,...) вместо того, чтобы просто переопределять isEqual:?


person Jaka Jančar    schedule 18.08.2009    source источник


Ответы (5)


isEqual: сравнивает строку с объектом и возвращает NO, если объект не является строкой. isEqualToString: быстрее, если вы знаете, что оба объекта являются строками, как документация гласит:

Особые соображения

Когда вы знаете, что оба объекта являются строками, этот метод является более быстрым способом проверки равенства, чем isEqual:.

isEqualTo<Class> используется для специальных проверок на равенство. Например; isEqualToArray: проверяет, что массивы содержат одинаковое количество объектов и что объекты с заданным индексом возвращают YES для проверки isEqual:.

person Abizern    schedule 18.08.2009
comment
Если вы верите Аарону Хиллегассу, то разницы в производительности нет, только немного безопасности типа: blog.bignerdranch.com/334-isequal-vs-isequaltostring - person Caro; 25.12.2013
comment
Спасибо за ссылку - полезная. Хотя вы просите нас поверить Марку Далримплу - кому я верю :) - person Abizern; 11.01.2014
comment
Обновленная ссылка: bignerdranch.com/blog/isequal-vs-isequaltostring - person Max; 06.03.2019

Кроме того, для написания собственных методов -isEqual: и -isEqualTo<Class>: соглашение состоит в том, чтобы разрешить нулевые аргументы для -isEqual: и создать исключение для нулевых аргументов для -isEqualTo<Class>:.

person Jonathan Dann    schedule 18.08.2009
comment
Я не сталкивался с этим раньше, какая-нибудь документация, о которой вы знаете? - person Mike Abdullah; 19.08.2009
comment
Это не похоже на правду для isEqualToString, которая просто возвращает NO, если вы передаете nil. - person Jaka Jančar; 21.08.2009
comment
Интересно, что это задокументировано в разделе «Сравнение объектов» документа ‹a href=developer.apple.com/documentation/Cocoa/Conceptual/ Руководство по основам‹/a› - person Jonathan Dann; 23.08.2009
comment
Это неправда. isEqualToString не вызывает исключения. - person respectTheCode; 19.06.2013
comment
На веб-странице руководства по основам какао говорится: «Этот документ может не представлять передовой опыт для текущей разработки». Он старый, видимо. - person cbh2000; 25.12.2013

Я предполагаю, что это обеспечивает небольшое повышение производительности, так как isEqualToString: не нужно проверять тип того, что передается.

person iKenndac    schedule 18.08.2009
comment
Ваша догадка скорее всего верна :) - person Philip007; 17.01.2013

Расширяя ответы @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");
}
person respectTheCode    schedule 19.06.2013

Я настоятельно рекомендую это. Преимущества isEqualToString в производительности в большинстве приложений незначительны. Но есть еще два отличия, о которых упоминает автор:

  • Безопасность типа
  • Как обрабатывается nil
person Ben Packard    schedule 03.08.2013
comment
Я не вижу никакой разницы в том, как они обрабатывают nil. Быть nil быть получателем или аргументом или обоими. - person SayeedHussain; 13.12.2014
comment
Что бы это ни было, больше не существует :/ - person Jared Grubb; 19.07.2018
comment
Спасибо @JaredGrubb, я нашел новый URL. - person Ben Packard; 19.07.2018