2012-12-09 4 views
6

Beide Methoden geben gleiche Ergebnisse zurück. Natürlich vergleicht -[NSObject isEqual:] nicht die Zeiger von Objekten, es überprüft irgendwie die inneren Felder oder was auch immer. Also, was ist der Sinn der Verwendung genau -[NSNumber isEqualToNumber:], um zwei NSNumber s zu vergleichen?- [NSObject isEqual:] und - [NSNumber isEqualToNumber:]: Was ist der Unterschied?

+0

'-isEqual:' prüft Objekt-Hashes (außer außer Kraft gesetzt). – CodaFi

+0

@CodaFi Es scheint, dass es in 'NSNumber' überschrieben wird (weil zwei 'NSNumber's mit gleichen Hashes ungleich' isEqual' sind). Das ist die Frage. – efpies

Antwort

8

Vom docs:

Zwei NSNumber Objekte werden als gleich, wenn sie die gleichen Werte haben ID oder wenn sie äquivalente Werte haben (wie durch den bestimmt vergleichen: Methode). Diese Methode ist effizienter als vergleichen: Wenn Sie wissen, die zwei Objekte sind Zahlen.

So behandelt es id equals und Zahlenvergleich.

+1

Was bedeuten sie nach "äquivalenten Werten"? '@ 1' und' @ 1.0' sind natürlich äquivalent, aber gibt es ein Beispiel für Werte, wenn 'isEqualToNumber' selbst * verwendet * werden muss? Schauen Sie sich meine Tests auch für '@ 1' und' @ 1.0000000001' an (die sogar die gleichen Hashes und die verschiedenen Zeiger haben) 'isEqual' und' isEqualToNumber' haben die gleichen Ergebnisse. – efpies

+0

Wenn der Vergleich: NSOrderedSame zurückgibt, sind sie äquivalente Werte. Ich würde vermuten, dass isEqualToNumber gleich Delegaten ist, wenn sie nicht die gleichen Objekte sind und sie beide NSNumbers sind. –

+5

@TerryWilcox Sie haben Recht. Siehe Zeile 416 von [NSNumber.m] (https://code.google.com/p/cocotron/source/browse/Foundation/NSNumber/NSNumber.m). –

-2

-[NSObject isEqual:] überprüft, ob die beiden Objekte haben die Zeigeradresse und Hash während -[NSNumber isEqualToNumber:] überprüft, ob die Werte gleich sind.

NSNumber s, die gleichen Werte haben die gleiche Zeigeradresse sind.

+0

Also erwarte ich, dass '@ 1' und' @ 1.0' gleiche Hashes haben. Nein? Aber eigentlich tun sie es. – efpies

+0

NSNumber behält den Typ nicht bei. NSNumber von 0 bis 12 werden zwischengespeichert, also sind sie wahrscheinlich beide das gleiche Objekt. –

+1

Die Standardimplementierung von isEqual: vergleicht die beiden Objekte ids, nicht Hashes. Zwei ungleiche Objekte können den gleichen Hash haben. –

2

Sie sind im Wesentlichen identisch, obwohl isEqual eine Typüberprüfung für die Klasse des übergebenen Objekts durchführen muss. IsEqualToNumber gibt die Überprüfung zur Kompilierzeit ein, die, wenn möglich, besser ist.

Verwandte Themen