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.

War es hilfreich?

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 von isEqual: 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top