Tak, zakodowane na stałe NSStrings (literały ciągów) (czyli dowolne @"..."
w kodzie źródłowym) są zamieniane na ciągi, które istnieją w nieskończoność podczas działania procesu.
Jednak NSArray „s containsObject:
metody połączenia isEqual:
na swoich obiektach, stąd nawet tworzone dynamicznie strunowe takie jak [NSString stringWithFormat:@"%d", 2]
wróciYES
w przykładowym fragmencie.
Dzieje się tak, ponieważ metoda NSString isEqual:
(a dokładniej jej isEqualToString:
) została zaimplementowana, aby być świadomym treści (w przeciwieństwie do porównywania tożsamości wskaźników) i dlatego zwraca YES
każdą parę ciągów zawierających tę samą sekwencję znaków (w czasie porównania), bez względu kiedy zostały stworzone.
Aby sprawdzić równą (wskaźnikową) tożsamość, musisz wyliczyć swoją tablicę i porównać za pomocą
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(czego najprawdopodobniej byś nie chciał).
Lub w wygodniejszy sposób:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(najprawdopodobniej tego też byś nie chciał).
Podsumowując:
Zatem powodem, dla którego otrzymujesz pozytywną odpowiedź, NIEcontainsObject:
jest fakt, że ciągi literalne mają tę samą stałą instancję, ALE ponieważ są to wywołania konwencji , które są świadome treści.containsObject:
isEqual:
Może chcesz przeczytać (krótka) dokumentacji isEqual:
z protokołem NSObject .