微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个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返回的对象.

解决方法

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐