5

我有一个 NSMutableOrderedSet,我正在从中添加和删除 MTLModels。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:

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

4

1 回答 1

5

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

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

于 2013-10-15T20:41:55.970 回答