NSSet和NSCountedSet,何时才是使用它们的最佳时机?

时间:2009-05-22 13:43:30

标签: objective-c cocoa cocoa-touch foundation

我很少使用这两种集合类型,因为我通常使用它们的计数器部分NSArrayNSDictionary和等效的变量。我有一种感觉,我错过了一个集合,在某些情况下它可以比其他两个更快。何时是使用这些以及如何使用的理想时间?

3 个答案:

答案 0 :(得分:14)

当您经常希望测试对象的成员资格时,会使用

NSSet,但不关心排序,也不需要集合包含重复的对象。 NSSet不以任何特定顺序存储其对象;相反,该类被明确设计为有效地测试集合中的对象是否存在

同样适用于NSCountedSet,但NSCountedSet也会保留重复对象的计数

简而言之:当你担心测试成员时使用一个集合,而不是只保留一组对象(其中一些可能是重复的,由{{1决定)某种方法)。

答案 1 :(得分:11)

跟随midpadi,NSArray的许多用途应该用NSSet替换。 NSSet是唯一对象的集合。 NSArray是有序对象的集合。如果您的对象没有固有顺序且是唯一的,则应使用NSSet。

我经常在模型层中保留一个NSSet,让需要订单的UI组件创建自己的NSArrays。例如,考虑由“伙伴”组成的“好友列表”的情况。好友列表本身是无序的;它只是一个集合。对象需要是唯一的。但是,在UI层,您需要订单,甚至可能希望将同一个伙伴放在多个组中(例如,收藏夹和脱机)。但这些是UI问题,模型层不应该担心它们。

NSSet *buddies = [buddyList allBuddies];
BOOL isBuddy = [buddyList containsObject:buddy];

NSArray *buddyList = [[buddyList allBuddies] sortedAraryUsingSelector:[self buddySortSelector]];

当一个新好友出现时,BuddyList会发布一个通知(BuddyListDidAddBuddiesNotification),其中包含一个在其userInfo中添加了好友的NSSet。因此,观察此内容的UI元素可以以适当的排序顺序将伙伴插入其列表中。这使得列表动画非常容易,如果您在模型层维护所有已排序的版本,这将更加困难。

当你有两个NSSets时,很容易找出它们之间的差异并构建一系列删除并添加到另一个(再次,对于动画有用)。使用NSArray执行此操作要复杂得多。

所以我的建议是默认为NSSet。您只应在实际需要订购时使用NSArray。不幸的是,大多数人都这样做了。

答案 2 :(得分:4)

除了主要讨论集合而不是计数集的其他答案之外,您可能想知道何时最好使用计数集。计数集对于加权或其他统计算法很有用:最后,您最终可以使用存储的计数创建其内容的有序数组。

另一个选择是在unquing表中,或者以引用计数器/垃圾收集器的形式。使用计数集将启用包含测试(即返回现有的相同对象,而不是创建一个新的 - 与CoreData内部的相似),同时还对其包含的值执行一种引用计数,因为该对象只是一旦计数达到0,就由该集发布。