5

MTLModels を追加および削除する NSMutableOrderedSet があります。hash メソッドと isEqual メソッドは両方とも 2 つのオブジェクトに対して 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 に含まれているかどうかを確認すると、firstObject によって返されるオブジェクトであっても、NO が返されます。

4

1 に答える 1

5

オブジェクトをセットに追加した後、オブジェクトを変更している可能性があります。これは許可されていません。セットはハッシュを再計算しないため、オブジェクトを変更すると、セットによって保存されたハッシュとは異なるハッシュになります。これが、新しいコレクション (この場合は配列) の作成が機能する理由です。つまり、すべてのハッシュが再計算されるためです。

編集:明確にするために、オブジェクトをセットに追加した後にオブジェクトを変更できますが、そのハッシュ値は変更してはなりません。

于 2013-10-15T20:41:55.970 に答える