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.