Objective c NSSet';s containsObject:测试指针相等还是值相等?
假设我有一个带有字符串的Objective c NSSet';s containsObject:测试指针相等还是值相等?,objective-c,cocoa,collections,foundation,nsset,Objective C,Cocoa,Collections,Foundation,Nsset,假设我有一个带有字符串的NSSet。如果我用另一个字符串发送containsObject:,该字符串是不同的指针,但字符串值完全相同,那么该字符串是否会返回YES 另外,对于removeObject:,情况是否相同?即,具有不同指针但具有相同字符串值的不同对象将导致删除?-containsObject:使用-isEqual:(和-hash)进行相等性测试。这同样适用于-removeObject:以及NSSet中依赖于某种相等概念的任何其他操作。您尝试过吗?你有任何理由相信它不会吗?如果它认为两个
NSSet
。如果我用另一个字符串发送containsObject:
,该字符串是不同的指针,但字符串值完全相同,那么该字符串是否会返回YES
另外,对于
removeObject:
,情况是否相同?即,具有不同指针但具有相同字符串值的不同对象将导致删除?-containsObject:使用-isEqual:
(和-hash
)进行相等性测试。这同样适用于-removeObject:
以及NSSet
中依赖于某种相等概念的任何其他操作。您尝试过吗?你有任何理由相信它不会吗?如果它认为两个具有相同内容的字符串是同一个对象,那么你无法将第二个字符串放入集合,因此removeObject:问题的一部分是没有意义的。NSSet声称提供“不同对象的静态集合”,而不是“不相等对象的静态集合”。是的,这是有效的。可以确认相等字符串的containsObject测试。我用它来优化核心数据更新,所以我不必每次都查找实体来查看它是否存在。我只使用我的键字段,它是一个字符串。@用户:文档中说它使用了isEqual:
member
是其中之一,而且似乎暗示(尽管您是对的,不是明确的),containsObject:
使用member
@user256413:根据定义,所有依赖相等的NSSet方法都必须使用相同的相等测试。如果不指定其他相等函数,CFSet将使用指针相等。如果使用kCFTypeSetCallBacks
,则它使用CFEqual()
作为相等比较。@jowie:NSSet
是一个哈希表<代码>-[NSMutableString哈希]取决于字符串的内容。明确不支持在字符串位于集合中时对其进行变异(与在NSDictionary
中对其进行变异相同),因为这会更改哈希值,从而导致查找失败。但是,set.allObjects
会生成一个NSArray
,它不使用散列
@jowie:因为另一种选择是每个NSMutableString
都有相同的散列,当存储在字典/集合中时会产生绝对糟糕的性能。简单的规则是,你不应该对放入NSSet
或用作NSDictionary
@jowie的键的对象进行变异:NSSet
实际上是一个没有值的NSDictionary
,这是正确的。但是不,一个NSArray
与一个值完全不同NSDictionary
(除了所有的性能差异之外,NSDictionary
s是未排序的,NSArray
s是排序的)。