Проверьте, содержится ли экземпляр NSString в NSArray

80

У меня есть массив с кучей строк, и я хочу проверить, содержится ли в массиве определенная строка. Если я использую containsObjectсообщение: в массиве, я получаю правильные результаты. Все ли NSStringобъекты с одинаковой строкой указывают на один и тот же объект? Или почему containsObject: работает?

Преподобный
источник

Ответы:

171

Да, жестко запрограммированные NSStrings (строковые литералы) (то есть любые @"..."в вашем исходном коде) превращаются в строки, которые существуют бесконечно во время работы вашего процесса.

Однако NSArray «s containsObject:метода вызовы isEqual:на своих объектах, следовательно , даже динамически создаваемые строки , такие , как [NSString stringWithFormat:@"%d", 2] бы вернутьсяYES в вашем образце фрагмента кода.
Это связано с тем, что метод NSString isEqual:(или, точнее, его isEqualToString:) реализован с учетом содержимого (вместо сравнения идентификаторов указателей) и, таким образом, возвращает YESдля любой пары строк, содержащих одну и ту же последовательность символов (во время сравнения), независимо от того, как и когда они были созданы.

Чтобы проверить идентичность (указатель), вам нужно будет перечислить свой массив и сравнить через

(хотя вы, скорее всего, не захотите).

Или более удобным способом:

(вы, скорее всего, тоже не захотите этого).


Подводя итоги:

Таким образом, причина, по которой вы получаете положительный ответ, НЕcontainsObject: состоит в том, что буквальные строки используют один и тот же экземпляр константы, НО из- за вызовов соглашений , которые учитывают контент.containsObject:isEqual:

Вы можете прочитать (короткую) документацию для isEqual:из протокола NSObject .

Regexident
источник
17

containsObject:выполняет проверку значения, а не проверку указателя. Он использует isEqual:метод, определенный NSObject и переопределенный другими объектами для тестирования. Следовательно, если две строки содержат одинаковую последовательность символов, они будут считаться одинаковыми.

В некоторых случаях различие между проверкой указателя и проверкой значения очень важно. Константные строки, определенные в исходном коде, объединяются компилятором так, чтобы они были одним и тем же объектом. Однако строки, созданные динамически, не являются одним и тем же объектом. Вот пример программы, которая продемонстрирует это:

Результат этой программы:

2011-04-27 17: 10: 54.686 a.out [41699: 903] constantString == constantString2
2011-04-27 17: 10: 54.705 a.out [41699: 903] constantString! = DynamicString 27.04.2011
17 : 10: 54.706 a.out [41699: 903] [constantString isEqual: dynamicString] == ДА
2011-04-27 17: 10: 54.706 a.out [41699: 903] theArray содержит:
constantString: 1
constantString2: 1
dynamicString: 1

ughoavgfhw
источник
4

Вы можете использовать, containsObjectчтобы узнать, существует ли определенная строка,

Исуру
источник