containsObject:当isEqual和hash匹配时返回NO

时间:2013-10-15 05:27:08

标签: ios objective-c

我有一个NSMutableOrderedSet,我从中添加和删除MTLModel。 hash和isEqual方法都将为两个对象返回true,但containsObject将返回false。

有时候这段代码有效,有时也没有。

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]);
}

更新

作为后续操作,当NSMutableOrderedSet返回NO:

时,返回YES
[[self.models array] containsObject:model]

更新2:

如果我检查self.models中是否包含modelInSet,那么它也会返回NO,即使它是firstObject返回的对象。

1 个答案:

答案 0 :(得分:5)

在将对象添加到集合后,您可能正在改变对象。这是不允许的。该集合不会重新计算哈希值,因此如果您改变对象,它将具有与该集合存储的哈希值不同的哈希值。这就是为什么创建一个新的集合(在你的情况下是数组),即因为它重新计算所有哈希值。

编辑:要清楚,您可以在将对象添加到集合后改变对象,但其哈希值不得更改。