У меня есть 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.
Это выглядит странно. Можете ли вы показать свою реализацию 'isEqual:' и 'hash'? –
Да, вы можете увидеть оба здесь: https://github.com/github/Mantle/blob/master/Mantle/MTLModel.m#L217 –
Что делает '[self.models containsObject: modelInSet]' return? Если он возвращает 'NO', то я подозреваю, что вы мутируете свой объект после того, как вы добавили его в набор, что запрещено. Это объясняет, почему новая коллекция работает правильно. – fumoboy007