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
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 .