Sì, NSStrings hard-coded (stringhe) (vale a dire qualsiasi @"..."
nel codice sorgente) si trasformano in stringhe che esistono a tempo indeterminato, mentre il processo è in esecuzione.
Tuttavia NSArray s' containsObject:
metodi chiama isEqual:
sui suoi oggetti, quindi anche una stringa creata dinamicamente come [NSString stringWithFormat:@"%d", 2]
sarebbe tornato YES
nel tuo snippet campione.
Questo perché NSString di isEqual:
(o più precisamente il suo isEqualToString:
) metodo viene attuato essere contenuti consapevoli (vs confrontando identità puntatore) e restituisce quindi YES
per ogni coppia di stringhe contenenti la stessa sequenza di caratteri (al momento confronto), non importa come e quando sono stati creati.
Per controllare per la parità (pointer-) identità che avrebbe dovuto elencare l'array e confrontare via
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(che molto probabilmente non si vuole, però).
O in un modo più conveniente:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(molto probabilmente non vorrebbe questo uno o).
Riassumendo:
Quindi la ragione che stai ricevendo una risposta positiva da containsObject:
è NON perché le stringhe letterali condividono la stessa istanza costante, MA perché containsObject:
per convenzione chiamate isEqual:
, che è consapevole del contenuto.
Si consiglia di leggere la (breve) documentazione per da NSObject protocol.