Проверьте, существует ли уникальный объект в NSArray

У меня есть NSMutableArray, куда можно добавлять объекты. Добавленные объекты — это SUPDataValue объекты, содержащие набор SUP данных.

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

Я использую «objectExists», и он отлично работает... однако... если я дважды добавлю один и тот же объект в свой массив объектов, он всегда будет предполагать, что он существует в слое.

Это мой код:

- (void)setInitialComponents:(NSMutableArray*)components
{
    if (self.componentLayer)
    {
        for (SUPDataValueList *val in components)
        {
            BOOL found = NO;

            for (NSMutableArray *layer in self.componentLayer)
            {
                if ([layer containsObject:val])
                {
                    found = YES;
                }
            }

            if (!found)
            {
                [[self.componentLayer objectAtIndex:0] addObject:val];
            }
        }
    }
    else {
        self.componentLayer = [NSMutableArray array];

        // Add the no-layer layer (section 0)
        [self.componentLayer addObject:[NSMutableArray array]];

        if (self.addMode)
        {
            [[self.componentLayer objectAtIndex:0] addObjectsFromArray:components];
        }
        else {
            for (SUPDataValueList * val in components)
            {
                int layer = [[NSString stringWithFormat:@"%@", [val item:38]] intValue];

                if (self.componentLayer.count < layer)
                {
                    [self.componentLayer insertObject:[NSMutableArray array] atIndex:layer-1];
                }

                [[self.componentLayer objectAtIndex:layer-1] addObject:val];
            }
        }
    }

    [self.tableView reloadData];
}

Как вы могли догадаться, моя проблема здесь:

if ([layer containsObject:val])
{
    found = YES;
}

Я хотел бы проверить, существует ли в этом массиве уникальный объект (используя идентификатор выделения памяти или что-то в этом роде?). Как мне это сделать?


person Paul Peelen    schedule 06.11.2013    source источник
comment
Почему бы просто не использовать NSSet?   -  person    schedule 06.11.2013
comment
Потому что вы не можете добавить два одинаковых объекта в NSSet, если я не ошибаюсь. Я попробовал NSSet и получил только 1 объект SUPDataValue, а не несколько одинаковых.   -  person Paul Peelen    schedule 06.11.2013
comment
NSCountedSet может соответствовать вашим требованиям, тогда   -  person Monolo    schedule 06.11.2013
comment
Хорошо, я посмотрю.   -  person Paul Peelen    schedule 06.11.2013


Ответы (2)


Метод containsObject вызовет isEqual: для сравниваемых базовых объектов.

Если вы не реализуете isEqual: в объекте SUPDataValueList, он просто выполнит сравнение указателей, что является поведением isEqual по умолчанию в NSObject.

person skajake    schedule 06.11.2013
comment
Итак, вы говорите, что я должен добавлять один и тот же объект несколько раз в свой массив компонентов, верно? - person Paul Peelen; 06.11.2013
comment
Я нашел решение. Я добавлял один и тот же объект памяти снова и снова, и, поскольку гениально SUP не поддерживает копирование в SUPDataValueList, мне пришлось написать собственное решение вокруг него. Итак, косвенный ваш ответ правильный. Он работает именно так, как должен, containsObject т.е. - person Paul Peelen; 06.11.2013

Вы ищете -[NSArray indexOfObjectIdenticalTo:], который использует адреса объектов для определения соответствия.

found = [layer indexOfObjectIdenticalTo:val] != NSNotFound;
person jscs    schedule 06.11.2013