objective-c - NSMutableSet 添加对象

标签 objective-c foundation

我有一个环绕 NSMutableSet 对象的类,我有一个实例方法将对象(使用 addObject: 方法)添加到 NSMutableSet

这很好用,但我闻到了性能问题,因为在方法中我在将对象添加到集合之前显式调用了 containsObject:

三部分问题:

  1. 在将对象添加到集合之前是否需要调用 containsObject:
  2. 如果是这样,那么我应该使用什么实际方法,containsObjectcontainsObjectIdenticalTo:
  3. 如果不是这样,在 addObject: 的幕后会调用什么 contains 方法?这对我很重要,因为如果我将一个对象传递给 containsObject:,它会返回 true,但如果我将它传递给 containsObjectIdenticalTo:,它会返回 false。

最佳答案

如果您要包装一个 NSMutableSet,则不需要调用 containsObject:,因为一个集合 (by definition) 不包含重复项。因此,如果您尝试插入一个已经在集合中的对象,则不会发生任何事情。

就性能影响而言,不要担心,除非您实际衡量它是一个问题。如果你能做到,我会非常非常非常惊讶,因为一个集合(至少,一个集合的智能实现)具有 O(1) 查找时间(平均情况)。我向你保证 NSSet 和它的 friend 们是聪明的实现。 :)

根据我收集到的关于 NSSet 实现的信息,如果您使用 containsObject:addObject:。如果您使用 containsObjectIdenticalTo:,它仍会使用 -hash 来缩小搜索过程,然后(实质上)进行指针比较以找到相同的对象。

关于objective-c - NSMutableSet 添加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3956929/

相关文章:

objective-c - ParseKit.framework 无法工作,找不到 Foundation.h

objective-c - 未调用未捕获的异常处理程序

objective-c - 将数字添加到小数点的末尾(Objective-c)

ios - 将 JSON NSData 转换为 NSDictionary

ios - UIScrollView:仅在允许时滚动

iphone - 日期排序的 NSArray

Objective-c:从方法返回自动释放的对象

iphone - 将自定义注释添加到 map 时使用

swift - Swift Foundation 的 UUID 是否默认包含时间?

objective-c - 是否可以在子类中重新声明私有(private) ivar 以使其可访问?