NSSet的containsObject:测试指针相等或值相等吗?

Chr*_*ris 30 collections cocoa objective-c foundation nsset

假设我有NSSet一个字符串.如果我发送containsObject:另一个字符串,它是一个不同的指针,但完全相同的字符串值,将返回YES

此外,它涉及到同样的故事removeObject:吗?即,具有不同指针但具有相同字符串值的不同对象将导致删除?

Lil*_*ard 40

-containsObject:使用-isEqual:(和-hash)进行相等测试.这同样适用-removeObject:,并且其中的任何其他操作NSSet都依赖于某些平等概念.

  • @ user256413:依赖于相等性的所有NSSet方法必须使用相同的相等性测试.如果不指定另一个相等函数*,CFSet将使用指针相等*.如果使用`kCFTypeSetCallBacks`则它使用`CFEqual()`作为相等比较. (4认同)
  • @user:[` - [NSSet member:]`](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html#//apple_ref/doc/uid/20000143-CHDCHEDC)文档说它使用`isEqual:`; `member`是[基本集合方法]之一(http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Articles/Sets.html%23//apple_ref/doc/uid/20000136-SW3),似乎暗示(但是,你是对的,不明确的)`containsObject:`使用`member`. (2认同)
  • @jowie:`NSSet`是一个哈希表.` - [NSMutableString hash]`取决于字符串的内容.当字符串在字符集中时,它变异显然是不受支持的(与它在`NSDictionary`中的变异相同),因为这会改变散列,这会使查找失败.但是,`set.allObjects`生成一个不使用`hash`的`NSArray`. (2认同)
  • @jowie:因为替代方法是每个单独的`NSMutableString`具有相同的哈希值,当存储在词典/集合中时,这将产生绝对*非常糟糕的*性能.简单的规则是你不应该改变一个放在`NSSet`中的对象或用作`NSDictionary`的键. (2认同)