我有一个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返回的对象。
答案 0 :(得分:5)
在将对象添加到集合后,您可能正在改变对象。这是不允许的。该集合不会重新计算哈希值,因此如果您改变对象,它将具有与该集合存储的哈希值不同的哈希值。这就是为什么创建一个新的集合(在你的情况下是数组),即因为它重新计算所有哈希值。
编辑:要清楚,您可以在将对象添加到集合后改变对象,但其哈希值不得更改。