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 YES
fü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
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(was Sie aber höchstwahrscheinlich nicht wollen würden).
Oder bequemer:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(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 .