NSSet的containsObject:方法是测试指针相等还是值相等?

30

假设我有一个包含字符串的 NSSet,如果我使用另一个字符串发送 containsObject: ,这个字符串指针与原字符串相比不同但值相同,那么它会返回 YES 吗?

同样的,当涉及到 removeObject: 时,情况是否相同?也就是说,不同的对象具有不同的指针但具有相同的字符串值将导致移除吗?


3
你试过了吗?你有任何理由相信它不会成功吗? - jscs
1
如果认为具有相同内容的两个字符串是相同的对象,那么您将无法将第二个字符串放入集合中,因此问题中的removeObject:部分是无意义的。NSSet声称提供“不同对象的静态集合”而不是“非相等对象的静态集合”。 - Jeff Laing
是的,这个可行。可以确认containsObject测试相等的字符串。我用它来优化核心数据更新,这样我就不必每次查找实体是否存在。我只使用我的键字段,它是一个字符串。 - SpaceTrucker
1个回答

40

-containsObject: 使用 -isEqual:(和 -hash)进行相等性测试。这同样适用于 -removeObject: 以及 NSSet 中依赖一些相等性概念的任何其他操作。


2
@user: -[NSSet member:] 的文档说明它使用了 isEqual:; member基本的集合方法 之一,并且似乎隐含着(尽管不是明确地)containsObject: 使用 member. - jscs
4
所有依赖于相等性的NSSet方法都必须使用相同的相等性测试,这是定义中规定的。如果您没有指定其他相等性函数,CFSet将使用指针相等性。如果您使用kCFTypeSetCallBacks,则它将使用CFEqual()作为相等比较。 - Lily Ballard
2
@jowie:NSSet是一个哈希表。-[NSMutableString hash]取决于字符串的内容。当字符串在集合中时,如果对其进行更改,则会显式地不受支持(与在NSDictionary中更改它相同),因为这会更改哈希值,从而导致查找失败。但是,set.allObjects生成一个不使用hashNSArray - Lily Ballard
2
@jowie:因为另一种选择是让每个NSMutableString具有相同的哈希值,这将在存储在字典/集合中时产生绝对糟糕的性能。简单的规则是,您不应该改变已放入NSSet或用作NSDictionary键的对象。 - Lily Ballard
1
@jowie:NSSet 实际上是一个没有值的 NSDictionary,这是正确的。但是,NSArray 与仅包含值的 NSDictionary 完全不同(除了所有性能差异之外,NSDictionary 是未排序的,而 NSArray 是排序的)。 - Lily Ballard
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接