NSString: isEqual vs. isEqualToString

94

Jaka jest różnica między isEqual:i isEqualToString:?

Dlaczego klasy dodają metody isEqualTo * (isEqualToArray dla NSArray, isEqualToData dla NSData, ...) zamiast tylko nadpisywać isEqual:?

Jaka Jančar
źródło

Odpowiedzi:

103

isEqual:porównuje ciąg z obiektem i zwróci wartość, NOjeśli obiekt nie jest łańcuchem. isEqualToString:jest szybsze, jeśli wiesz, że oba obiekty są ciągami znaków, zgodnie z dokumentacją :

Uwagi specjalne

Gdy wiesz, że oba obiekty są łańcuchami, ta metoda jest szybszym sposobem sprawdzenia równości niż isEqual:.

isEqualTo<Class>służy do zapewnienia określonych kontroli równości. Na przykład; isEqualToArray:sprawdza, czy tablice zawierają taką samą liczbę obiektów i czy obiekty o podanym indeksie wracają YESdo isEqual:testu.

Abizern
źródło
3
Jeśli wierzysz Aaronowi Hillegassowi, to nie ma różnicy w wydajności, tylko odrobina bezpieczeństwa: blog.bignerdranch.com/334-isequal-vs-isequaltostring
Caro
2
Dzięki za link - przydatne. Chociaż prosisz nas, abyśmy uwierzyli Markowi Dalrymple - temu, co robię :)
Abizern
16

Ponadto, w przypadku pisania własnych metod -isEqual:i -isEqualTo<Class>:metod, konwencją jest dopuszczenie zerowych argumentów dla -isEqual:i zgłoszenie wyjątku dla zerowych argumentów do-isEqualTo<Class>:

Jonathan Dann
źródło
1
Nie spotkałem tego wcześniej, żadnej dokumentacji, którą znasz?
Mike Abdullah
2
Wydaje się, że nie jest to prawdą dla isEqualToString, który po prostu zwraca NO, jeśli przekażesz nil.
Jaka Jančar
9
Co ciekawe, jest to udokumentowane w sekcji Porównanie obiektów w <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Podstawy kursu</a>
Jonathan Dann
To nie jest prawda. isEqualToString nie zgłasza wyjątku.
respectTheCode
1
Na stronie internetowej Cocoa Fundamentals Guide jest napisane: „Ten dokument może nie reprezentować najlepszych praktyk w obecnym rozwoju”. Najwyraźniej jest stary.
cbh2000
5

Moje przypuszczenie jest to, że zapewnia lekką poprawę wydajności, jak isEqualToString: nie będzie trzeba wpisywać-czek, co przeszedł w.

iKenndac
źródło
Twoje przypuszczenie jest prawdopodobnie prawdziwe :)
Philip007
5

Poszerzanie wiedzy na @Abizern i @Jonathan Dann odpowiada zarówno na pytania, jak isEquali na isEqualToStringpracę z nilwartościami.

- (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");
}
szacunekTheCode
źródło
4

Bardzo to polecam . Korzyści z wydajności wynikające z isEqualToString są w zasadzie pomijalne dla większości aplikacji. Ale są jeszcze dwie inne rozróżnienia, o których wspomina autor:

  • Bezpieczeństwo typów
  • Sposób niljest obsługiwany
Ben Packard
źródło
Nie widzę żadnej różnicy w sposobie, w jaki nil jest traktowany przez obie. Be nil to odbiorca, argument lub jedno i drugie.
SayeedHussain
Cokolwiek „tego” już nie istnieje: /
Jared Grubb
1
Dzięki @JaredGrubb, znalazłem nowy adres URL.
Ben Packard,