2013-10-15 2 views
4

У меня есть NSMutableOrderedSet, из которого я добавляю и удаляю MTLModels. Методы hash и isEqual возвратят true для двух объектов, но containsObject вернет false.containsObject: возвращает NO, когда isEqual и hash match

Иногда этот код работает, а иногда и нет.

models count: 1 
isEqual: 1 
hashes equal: 1 
containsObject: 0 

Как это возможно, нижний код может распечатывать вышеуказанное?

@property (nonatomic, strong) NSMutableOrderedSet *models; 

- (void)remove:(MTLModel *)model { 
    NSLog(@"models count: %d", self.models.count); 
    MTLModel *modelInSet = (MTLModel *)self.models.firstObject; 
    NSLog(@"isEqual: %d", [modelInSet isEqual:model]); 
    NSLog(@"hashes equal: %d", modelInSet.hash == model.hash); 
    NSLog(@"containsObject: %d", [self.models containsObject:model]); 
} 

Update:

В последующих, это возвращает YES, когда NSMutableOrderedSet возвращает NO:

[[self.models array] containsObject:model] 

Update 2:

Если я проверяю modelInSet содержится в self.models, который также возвращает NO, хотя это объект retu rned by firstObject.

+0

Это выглядит странно. Можете ли вы показать свою реализацию 'isEqual:' и 'hash'? –

+0

Да, вы можете увидеть оба здесь: https://github.com/github/Mantle/blob/master/Mantle/MTLModel.m#L217 –

+0

Что делает '[self.models containsObject: modelInSet]' return? Если он возвращает 'NO', то я подозреваю, что вы мутируете свой объект после того, как вы добавили его в набор, что запрещено. Это объясняет, почему новая коллекция работает правильно. – fumoboy007

ответ

5

Возможно, вы, возможно, изменили объект после добавления его в набор. Это запрещено. Набор не пересчитывает хэши, поэтому, если вы мутируете объект, у него будет другой хеш из того, который хранится в наборе. Вот почему работает создание новой коллекции (массив в вашем случае), т. Е. Потому, что она пересчитывает все хеши.

EDIT: Чтобы быть ясным, вы можете мутировать объект после добавления его в набор, но его значение хэша не должно меняться.

+0

Большое спасибо! Вероятно, я должен был внимательно изучить документы, но мне никогда не приходило в голову, что это может быть так (я новичок в Objective-C). –

+0

В случае, когда хеш изменится, есть ли способ, чтобы набор очистил свой хэш-кеш? –

+0

Нет проблем! Кроме того, я могу ошибаться, но я не думаю, что это исключительно для Objective-C. :-) – fumoboy007

Смежные вопросы