Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSSet';s containsObject:测试指针相等还是值相等?_Objective C_Cocoa_Collections_Foundation_Nsset - Fatal编程技术网

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是排序的)。