NSString: isEqual vs. isEqualToString


94

Was ist der Unterschied zwischen isEqual:und isEqualToString:?

Warum fügen Klassen isEqualTo * -Methoden hinzu (isEqualToArray für NSArray, isEqualToData für NSData, ...), anstatt nur zu überschreiben isEqual:?

Antworten:


103

isEqual:vergleicht eine Zeichenfolge mit einem Objekt und gibt zurück, NOwenn das Objekt keine Zeichenfolge ist. isEqualToString:ist schneller, wenn Sie wissen, dass beide Objekte Zeichenfolgen sind, wie in der Dokumentation angegeben :

Besondere Überlegungen

Wenn Sie wissen, dass beide Objekte Zeichenfolgen sind, können Sie mit dieser Methode die Gleichheit schneller überprüfen als isEqual:.

isEqualTo<Class>wird verwendet, um spezifische Gleichheitsprüfungen durchzuführen. Zum Beispiel; isEqualToArray:Überprüft, ob die Arrays eine gleiche Anzahl von Objekten enthalten und ob die Objekte an einem bestimmten Index YESfür den isEqual:Test zurückgegeben werden.


3
Wenn Sie Aaron Hillegass glauben, dann gibt es keinen Leistungsunterschied, nur ein bisschen sicher
Caro

2
Danke für den Link - nützlich. Obwohl Sie uns bitten, Mark Dalrymple zu glauben - wer ich tue :)
Abizern


16

Zum Schreiben Ihrer eigenen -isEqual:und -isEqualTo<Class>:Methoden besteht die Konvention außerdem darin, keine Argumente für null Argumente zuzulassen -isEqual:und eine Ausnahme für null Argumente auszulösen-isEqualTo<Class>:


1
Ich war noch nie auf diese Dokumentation gestoßen, von der Sie wissen?
Mike Abdullah

2
Dies scheint für isEqualToString nicht zuzutreffen, das nur NO zurückgibt, wenn Sie nil übergeben.
Jaka Jančar

9
Interessant ist, dass es im Abschnitt Objektvergleich des <a href=" developer.apple.com/documentation/Cocoa/Conceptual/… Fundamentals Guide</a>
Jonathan Dann

Das ist nicht wahr. isEqualToString löst keine Ausnahme aus.
RespektTheCode

1
Auf der Webseite des Cocoa Fundamentals Guide heißt es: "Dieses Dokument stellt möglicherweise keine Best Practices für die aktuelle Entwicklung dar." Es ist anscheinend alt.
cbh2000

5

Ich vermute, dass es eine leichte Leistungssteigerung bietet, wie isEqualToString: Sie müssen nicht überprüfen, was übergeben wurde.


Ihre Vermutung ist wahrscheinlich wahr :)
Philip007

5

Erweitern Sie die Antworten von @Abizern und @Jonathan Dann isEqualund isEqualToStringarbeiten Sie mit nilWerten.

- (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");
}

4

Ich empfehle dieses . Die Leistungsvorteile von isEqualToString sind für die meisten Anwendungen grundsätzlich vernachlässigbar. Der Autor erwähnt jedoch noch zwei weitere Unterschiede:

  • Typensicherheit
  • Der Weg nilwird gehandhabt

Ich sehe keinen Unterschied in der Art und Weise, wie die beiden mit Null umgehen. Sei nicht der Empfänger oder das Argument oder beides.
SayeedHussain

Was auch immer "das" ist, existiert nicht mehr: /
Jared Grubb

1
Danke @JaredGrubb, ich habe die neue URL gefunden.
Ben Packard
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.