2010-10-18 35 views
4

我有一個圍繞着NSMutableSet對象的類,我有一個實例方法將對象(使用addObject:方法)添加到NSMutableSetNSMutableSet addObject

這個效果很好,但我嗅到了性能問題,因爲在將該對象添加到該集之前,我明確地調用了containsObject:

三部分的問題:

  1. 我需要被調用containsObject:之前,我對象添加到集合?
  2. 如果是這樣,那麼我應該使用什麼樣的實際方法,containsObjectcontainsObjectIdenticalTo:
  3. 如果不是這樣的話,引用的方法是什麼contains?這對我很重要,因爲如果我將一個對象傳遞給containsObject:它會返回true,但是如果我將它傳遞給containsObjectIdenticalTo:它將返回false。

回答

8

如果你包裝的NSMutableSet,然後調用containsObject:是不必要的,因爲一組(by definition)不包含重複。因此,如果您嘗試插入已在集合中的對象,則不會發生任何事情。

就性能問題而言,不要擔心它,除非實際測量它是一個問題。如果可以的話,我會非常非常驚訝,因爲一組(至少,一組智能實現)具有O(1)查找時間(平均情況)。我向你保證,NSSet和朋友都很聰明。 :)

從我收集到的有關的NSSet實施,它是在對象上調用-hash,以此來「羣」它們到箱子裏去,如果你使用containsObject:addObject:。如果您使用containsObjectIdenticalTo:,它仍然會使用-hash來縮小搜索過程,然後(實質上)執行指針比較以找到相同的對象。