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

Ben*_*n W 5 objective-c ios

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

有时这段代码有效,有时却没有.

models count: 1
isEqual: 1
hashes equal: 1
containsObject: 0
Run Code Online (Sandbox Code Playgroud)

下面的代码怎么可能打印出上面的内容?

@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]);
}
Run Code Online (Sandbox Code Playgroud)

更新:

作为后续,当NSMutableOrderedSet返回NO时返回YES:

[[self.models array] containsObject:model]
Run Code Online (Sandbox Code Playgroud)

更新2:

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

fum*_*007 5

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

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