Когда NSArray больше не содержит тот же элемент? - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть NSArray, хранящий NSDictionaries.Каждый словарь имеет два ключа;имя и подмассив, содержащий 'items'.

Я хочу проверить, остается ли один из этих словарей в NSArray после определенной операции.Перед операцией я сохраняю указатель orginalDictionary на интересующий меня словарь. Затем я выполняю свою операцию (которая удаляет один из «элементов» из подмассива в этом словаре).После операции я подумал, что смогу проверить, существует ли сам Словарь (не удаленный элемент), используя

if ([arrayOfDictionaries containsObject:originalDictionary]) {...

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

Может ли это быть правдой?Если элемент в массиве изменится, не будет ли в функции selectedObject тот же объект?Или здесь что-то еще происходит?

РЕДАКТИРОВАТЬ Я начинаю думать, что причина, по которой мой массив заполняется, является основной причиной.Массив словарей создается из одного или нескольких других массивов, в зависимости от некоторых настроек. Эти массивы сами заполняются с помощью запроса на выборку, который создает словари на основе выбранных объектов.Таким образом, когда происходит изменение в некоторых данных (или, возможно, даже если выборка запускается простым запросом результата возврата массива), это будет перестроить возвращаемый массив, и словари внутри будут новыми элементами.Звучит ли это правильно?Если это так, я полагаю, у меня нет другого выбора, кроме как сохранить уникальный ключ, управляемый самостоятельно?

1 Ответ

0 голосов
/ 02 февраля 2012

containsObject: определяет, находится ли объект, представляющий то же самое значение , в массиве, это тот же самый тест, который используют isEqual: и indexOfObject:. Например. два совершенно разных словаря, которые содержат одинаковые пары ключ / значение, будут сравниваться одинаково, так как они представляют одно и то же значение - точно так же, как две целочисленные переменные сравниваются равными, если они содержат одно и то же целое значение

Метод indexOfObjectIdenticalTo: определяет наличие в массиве объекта .

Однако это не решает вашу проблему напрямую. Если у вас действительно есть NSMutableArray, который содержит NSMutableDictionary s, и вы сохраняете ссылку на NSMutableDictionary, который вы проверяете, тогда сравнение значений или объектов должно работать ...

Либо используйте отладчик для отслеживания фактических ссылок (адресов / указателей), либо выведите их на консоль, используя NSLog() и формат %p (например, NSLog(@"Tracked dict: %p", originalDictionary)).

...