Да, жестко запрограммированные строки NSS (строковые литералы) (т. Е. Любые @"..."
в вашем исходном коде) превращаются в строки, которые существуют бесконечно, пока ваш процесс работает.
Однако NSArray * containsObject:
вызывает методы isEqual:
для своих объектов, следовательно, даже динамически созданная строка , такая как [NSString stringWithFormat:@"%d", 2]
, вернет YES
в вашем примере фрагмента.
Это связано с тем, что метод NSString isEqual:
(или, точнее, его isEqualToString:
) реализован так, что он осведомлен о содержимом (вместо сравнения идентификаторов указателей) и, таким образом, возвращает YES
для любой пары строк, содержащих очень одинаковая последовательность символов (во время сравнения), независимо от того, как и когда они были созданы.
Чтобы проверить идентичность (указатель), вам нужно перечислить ваш массив и сравнить с помощью
NSString *yourString = @"foo";
BOOL identicalStringFound = NO;
for (NSString *someString in stringArray) {
if (someString == yourString) {
identicalStringFound = YES;
break;
}
}
(что вам, скорее всего, не хотелось бы).
Или более удобным способом:
BOOL identicalStringFound = [stringArray indexOfObjectIdenticalTo:someString] != NSNotFound;
(вы, скорее всего, тоже этого не захотите).
Подводя итог:
Таким образом, причина, по которой вы получаете положительный ответ от containsObject:
, заключается в НЕ , потому что литеральные строки совместно используют один и тот же константный экземпляр, НО , потому что containsObject:
по соглашениям isEqual:
, который осведомлен о содержании.
Возможно, вы захотите прочитать (краткую) документацию для isEqual:
из протокола NSObject .