Да, жестко запрограммированные NSStrings (строковые литералы) (то есть любые @"..."
в вашем исходном коде) превращаются в строки, которые существуют бесконечно во время работы вашего процесса.
Однако NSArray «s 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 .