2009-08-18 9 views
88

Was ist der Unterschied zwischen isEqual: und isEqualToString:?NSString: isEqual vs. isEqualToString

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

Antwort

95

isEqual: einen String in ein Objekt vergleicht, und kehrt NO, wenn die Objekt ist keine Zeichenfolge. isEqualToString: ist schneller, wenn Sie wissen beide Objekte Strings sind, wie die documentation Staaten:

Spezielle Überlegungen

Wenn Sie wissen beide Objekte Strings sind, ist diese Methode ein schneller Weg, um Gleichheit als isEqual: zu überprüfen.

isEqualTo<Class> wird verwendet, um spezifische Prüfungen auf Gleichheit bereitzustellen. Zum Beispiel; isEqualToArray: überprüft, dass die Arrays die gleiche Anzahl von Objekten enthalten und dass die Objekte an einem bestimmten Index YES für den isEqual: Test zurückgeben.

+3

Wenn Sie Aaron Hillegass glauben dann gibt es keinen Unterschied in der Leistung , nur ein bisschen Typ Sicherheit: http://blog.bignerdranch.com/334-isequal-vs -isequalostring/ – Caro

+2

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

5

Meine Vermutung ist, dass es eine leichte Leistungssteigerung, wie isEqualToString bietet. Müssen nicht typ überprüfen, was in übergeben wird

+0

Ihre Vermutung ist wohl wahr :) – Philip007

14

Auch für Ihre eigenen -isEqual: und -isEqualTo<Class>: Methoden schreiben, die Konvention ist null Argumente für -isEqual: und heben eine Ausnahme für null Argumente -isEqualTo<Class>:

+1

Ich war noch nie zuvor auf diese Dokumentation gestoßen, über die Sie Bescheid wissen? –

+1

Das scheint für isEqualToString nicht wahr zu sein, das nur NO zurückgibt, wenn Sie Null übergeben. –

+8

Interessant, es ist im Objektvergleich Abschnitt der Cocoa Fundamentals Guide

4

Erweiterung auf @Abizern und @ Jonathan Dann Antworten zu ermöglichen, sowohl isEqual und isEqualToString arbeiten mit nil Werte.

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

Ich empfehle this. Die Leistungsvorteile von isEqualToString sind für die meisten Anwendungen im Wesentlichen vernachlässigbar. Aber es gibt noch zwei weitere Unterscheidungen der Autor erwähnt:

  • Typ Sicherheit
  • Die Art und Weise nil behandelt wird
+0

Ich sehe keinen Unterschied in der Art, wie Nil von den beiden gehandhabt wird. Sei nicht der Empfänger oder das Argument oder beides. – SayeedHussain

Verwandte Themen