2 Stimmen

Direkter Vergleich von Objekten mit nil

Ich habe viele Beiträge hier auf Stack Overflow gesehen, die Objective-C-Benutzer davor warnen, Objekte nicht mit dem ==-Operator zu vergleichen. Zum Beispiel wird das Folgende immer abgeraten.

if (string1 == string2) {} // string1 und string2 sind beide vom Typ NSString *

Ich verstehe diese Warnung so, dass der ==-Operator in diesem Fall die Pointer-Gleichheit überprüft und nicht die tatsächlichen Werte von string1 und string2. Wenn das der Fall ist, warum sehe ich dann so oft Leute, die ihre Objekte mit nil mit dem ==-Operator vergleichen. Ich habe zum Beispiel das Folgende mehrmals gesehen.

if (obj == nil) {} // obj ist vom Typ id oder ein anderes Objekt

Wenn das Vergleichen von Zeigern mit dem ==-Operator bei Dingen wie NSStrings (oder NSNumbers oder NSArrays etc.) schlechte Praxis ist, warum ist es dann so verbreitet bei nil.

Ist dies der Standard, weil es nur eine Art von nil gibt, d.h.: nil ist immer gleich nil?
Warum werden direkte Vergleiche mit dem ==-Operator zwischen Objekten missbilligt, aber toleriert, wenn sie mit nil verglichen werden?

Vielen Dank für Ihre Zeit.

3voto

CrimsonChris Punkte 4611

Die Verwendung von == testet auf Zeiger-Gleichheit, was anscheinend das ist, was Sie in diesem speziellen Fall testen möchten. Sie überprüfen, ob ein bestimmter Zeiger ein nil-Zeiger ist. Speziell ein Zeiger, der null entspricht. Das Vergleichen von Objekten ist, wie Sie festgestellt haben, komplizierter. Die Gleichheit zwischen Objekten beruht oft darauf, dass einige interne Teile der beiden Objekte "gleich" sind.

Im Fall von Strings kann "Gleichheit" "hat die gleichen Zeichen" bedeuten, aber es könnte auch bedeuten "hat die gleichen Zeichen (ignoriert Großschreibung)". Es gibt auch Fälle, in denen Sie möchten, dass ein nil-String einem leeren String oder sogar einem String mit nur Leerzeichen entspricht. Der Punkt ist, dass Sie die unterschiedlichen Methoden zur Bestimmung der Gleichheit verstehen müssen, um Ihre eigene Definition der Gleichheit für Ihre Objekte zu implementieren.

Beachten Sie, dass das Überprüfen auf Zeiger-Gleichheit fast nie das ist, was Sie verwenden möchten, wenn Sie Dinge wie Strings oder Arrays vergleichen. Es gibt einige interessante Optimierungen, die Sie in die Irre führen können. Zum Beispiel zeigen alle leeren NSArrays auf dasselbe Singleton-Objekt.

1voto

Shane Hsu Punkte 7547

nil ist wie NULL in C oder std::nullptr in C++. Zeigt im Grunde auf nichts.

Wenn ein Objekt in Objective-C nicht allokiert ist (nicht mit alloc initialisiert wurde), wird der Zeiger nil sein.

Also wird if (obj == nil) überprüfen, ob obj allokiert ist (oder initialisiert, da dies oft zusammen passiert).

Diese Technik wird oft angewendet, wenn ein benutzerdefinierter Initialisierer geschrieben wird oder überprüft werden soll, ob ein bestimmtes Objekt existiert oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X