Was ist der NSObject isEqual: und Hash-Standardfunktion?
-
12-09-2019 - |
Frage
Ich habe eine Datenbank-Modell-Klasse, die ein NSObject
ist. Ich habe eine Reihe dieser Objekte in einem NSMutableArray
. Ich benutze indexOfObject:
eine Übereinstimmung zu finden. Problem ist das Speicheradresse Änderungen des Modellobjekts. So bin ich die zwingende hash
Methode des Modells Reihe ID zurückzukehren. Dies ist jedoch nicht das Problem beheben. Ich habe auch die isEqual:
Methode überschreibt, um den Wert der hash
Methode zu vergleichen.
Was bedeutet die isEqual:
Methode verwenden, um die Gleichstellung von Standard zu bestimmen?
Ich nehme an, es die Speicheradresse verwendet. die isEqual:
Dokumentation ich dachte, es den Wert aus der hash
Methode verwendet. Offensichtlich dies nicht der Fall, wie mein Versuch, diesen Wert zu überschreiben nicht mein erstes Problem lösen.
Lösung
Wie Sie richtig erraten haben, NSObject
die Standard isEqual:
Verhalten der Speicheradresse des Objekts zu vergleichen. Seltsamerweise ist dies derzeit nicht in der NSObject Klasse Referenz , aber es ist in der Introspection Dokumentation, in dem es heißt:
Der Standard
NSObject
Implementierung vonisEqual:
prüft einfach für Zeiger Gleichheit.
Natürlich, wie Sie zweifellos wissen, Subklassen von NSObject
können isEqual:
außer Kraft setzen sich anders zu verhalten. Zum Beispiel NSString
Methode des isEqual:
, wenn ein andere NSString
gibt, wird zuerst die Adresse überprüfen und dann prüfen, für eine genaue wörtliche Übereinstimmung zwischen den Saiten.
Andere Tipps
Die Antwort über Standardimplementierung von isEqual:
ist umfassend ein. So füge ich nur meine Notiz Standardimplementierung von hash
. Hier ist sie:
-(unsigned)hash {return (unsigned)self;}
D.h. es genau der gleiche Zeigerwert ist, der in isEqual:
verwendet wird. Hier ist, wie können Sie dies überprüfen:
NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj: %@",obj);
NSLog(@"hash: %x",obj.hash);
Das Ergebnis wird in etwa so sein:
obj: <NSObject: 0x16d44010>
hash: 16d44010
Mit freundlichen Grüßen.
BTW in iOS 8 hash
wurde eine Eigenschaft, keine Methode, aber es ist da.
Ich würde davon ausgehen, dass NSObject
isEquals
den ==
Operator verwendet, und hash
verwendet die Speicheradresse.
isEquals
Methode sollte nie verwendet hash
als absoluten Test auf Gleichheit. Es garantiert zwei Objekte mit ähnlichen hashCode
haben, wenn Sie genügend Objekte suchen (nur mehr als 2 ^ 32 verschiedene Objekte erstellen, und mindestens zwei von ihnen die gleiche hash
haben).
Mit anderen Worten erfordert hash
die folgende Spezifikation: Wenn zwei Objekte Gleichen sind, dann ihre hash
muss gleich sein; jedoch, wenn zwei Objekte hash
Werte Gleichen sind, sind sie nicht unbedingt gleich.
Als Tipp, sollten Sie immer außer Kraft setzen isEquals
und hashCode
zusammen.