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:?

Jaka Jančar
quelle

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.

Abizern
quelle
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>:

Jonathan Dann
quelle
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.

iKenndac
quelle
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");
}
respektiere den Code
quelle
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
Ben Packard
quelle
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