2013-11-06 6 views
3

У меня есть NSMutableArray, где объекты могут быть добавлены. Добавленные объекты: SUPDataValue объектов, содержащих кучу данных SUP.Проверьте, существует ли уникальный объект в NSArray

В другом виде я беру этот массив объектов и разбиваю его на 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; 
} 

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

+0

Почему бы просто не использовать 'NSSet'? –

+0

Поскольку вы не можете добавить два одинаковых объекта к NSSet, если я не ошибаюсь. Я попробовал NSSet, и у меня только 1 объект SUPDataValue, а не несколько. –

+0

'NSCountedSet' может соответствовать вашему счету, затем – Monolo

ответ

4

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

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

+0

Хорошо, так что вы говорите, что я должен добавлять один и тот же объект несколько раз к моему массиву компонентов, правильно? –

+0

Я нашел решение. Я добавлял один и тот же объект памяти снова и снова, и поскольку genial SUP не поддерживает копию в SUPDataValueList, мне пришлось написать свое собственное решение вокруг него. Итак, косвенный ответ правильный. Он работает точно так же, как должен содержать 'containsObject'. –

0

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

found = [layer indexOfObjectIdenticalTo:val] != NSNotFound;