我有一个包裹NSMutableSet
对象的类,我有一个实例方法,可以将对象(使用addObject:
方法)添加到NSMutableSet
。
这很好用,但我正在嗅到性能障碍,因为在将对象添加到集合之前,我明确地调用了containsObject:
。
三部分问题:
containsObject:
? containsObject
或containsObjectIdenticalTo:
? contains
的引擎下调用addObject:
方法是什么?这对我很重要,因为如果我将一个对象传递给containsObject:
,它将返回true,但是如果我将它传递给containsObjectIdenticalTo:
,它将返回false。答案 0 :(得分:8)
如果要包装NSMutableSet
,则不需要调用containsObject:
,因为集合(by definition)不包含重复项。因此,如果您尝试插入已在集合中的对象,则不会发生任何事情。
就性能影响而言,除非您实际测量它是一个问题,否则不要担心它。如果你能做到,我会非常非常惊讶,因为一组(至少是一组的智能实现)具有O(1)查找时间(平均情况)。我保证NSSet
和朋友是聪明的实施。 :)
根据我收集的有关NSSet
的实现情况,它会在对象上调用-hash
,以便在使用containsObject:
或{{addObject:
时将其“分组”到容器中1}}。如果您使用containsObjectIdenticalTo:
,它仍将使用-hash
缩小搜索过程范围,然后(基本上)执行指针比较以查找相同的对象。