Überprüfen Sie, ob die NSString-Instanz in einem NSArray enthalten ist

80

Ich habe ein Array mit einer Reihe von Zeichenfolgen und möchte überprüfen, ob eine bestimmte Zeichenfolge im Array enthalten ist. Wenn ich die containsObjectNachricht: im Array verwende, erhalte ich korrekte Ergebnisse. Zeigen alle NSStringObjekte mit derselben Zeichenfolge auf dasselbe Objekt? Oder warum containsObjectfunktioniert das:?

der Pfarrer
quelle

Antworten:

171

Ja, fest codierte NSStrings (Zeichenfolgenliterale) (die @"..."in Ihrem Quellcode enthalten sind) werden in Zeichenfolgen umgewandelt, die unbegrenzt vorhanden sind, während Ihr Prozess ausgeführt wird.

Allerdings NSArray ‚s containsObject:Methoden Anrufe isEqual:auf ihren Objekten, also auch eine dynamisch erzeugte Zeichenfolge wie [NSString stringWithFormat:@"%d", 2] zurückkehren würdeYES in Ihrem Probe - Schnipsel.
Dies liegt daran, dass die Methode von NSString isEqual:(oder genauer gesagt ihre isEqualToString:) so implementiert ist, dass sie inhaltsbewusst ist (im Vergleich zum Vergleichen von Zeigeridentitäten) und somit YESfür jedes Zeichenfolgenpaar zurückgibt , das dieselbe Zeichenfolge enthält (zum Zeitpunkt des Vergleichs), unabhängig davon, wie und als sie geschaffen wurden.

Um die gleiche (Zeiger-) Identität zu überprüfen, müssten Sie Ihr Array auflisten und über vergleichen

(was Sie aber höchstwahrscheinlich nicht wollen würden).

Oder bequemer:

(Sie würden diesen wahrscheinlich auch nicht wollen).


Zusammenfassen:

Der Grund, warum Sie eine positive Antwort erhalten, containsObject:ist NICHT, dass Literalzeichenfolgen dieselbe konstante Instanz verwenden, ABER weil containsObject:durch Konventionsaufrufe isEqual:, die inhaltsbewusst sind.

Möglicherweise möchten Sie die (kurze) Dokumentation isEqual:aus dem NSObject-Protokoll lesen .

Regexident
quelle
17

containsObject:führt eine Wertprüfung durch, keine Zeigerprüfung. Es verwendet die isEqual:von NSObject definierte und von anderen Objekten zum Testen überschriebene Methode. Wenn zwei Zeichenfolgen dieselbe Zeichenfolge enthalten, werden sie daher als gleich angesehen.

Die Unterscheidung zwischen Zeigertests und Wertetests ist in einigen Fällen sehr wichtig. Im Quellcode definierte konstante Zeichenfolgen werden vom Compiler so kombiniert, dass sie dasselbe Objekt sind. Dynamisch erstellte Zeichenfolgen sind jedoch nicht dasselbe Objekt. Hier ist ein Beispielprogramm, das dies demonstriert:

Die Ausgabe dieses Programms ist:

2011-04-27 17: 10: 54.686 a.out [41699: 903] KonstanteString == KonstanteString2
2011-04-27 17: 10: 54.705 a.out [41699: 903] KonstanteString! = DynamicString
2011-04-27 17 : 10: 54,706 a.out [41699: 903] [constantString isEqual: dynamicString] == JA
2011-04-27 17: 10: 54,706 a.out [41699: 903] theArray enthält:
constantString: 1
constantString2: 1
dynamicString: 1

ughoavgfhw
quelle
4

Sie können verwenden, containsObjectum herauszufinden, ob eine bestimmte Zeichenfolge vorhanden ist.

Isuru
quelle