Да, жестко запрограммированные NSString (строковые литералы) (то есть любые @"..."
в вашем исходном коде) превращаются в строки, которые существуют неопределенно долго, пока ваш процесс работает.
Однако методы containsObject:
NSArray вызывают isEqual:
для своих объектов, поэтому даже динамически созданная строка, такая как [NSString stringWithFormat:@"%d", 2]
, вернет YES
в вашем примере фрагмента кода.
Это связано с тем, что метод isEqual:
(или, точнее, его isEqualToString:
) в NSString реализован с учетом контента (в отличие от сравнения идентификаторов указателей) и, таким образом, возвращает 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.
person
Regexident
schedule
27.04.2011