我很少使用这两种集合类型,因为我通常使用它们的计数器部件NSArray
,NSDictionary
以及等效的可变部件.我有一种感觉,我错过了一个集合,在某些情况下它可以比其他两个更快.何时是使用这些的理想时间以及如何使用?
NSSet
当您经常希望测试对象的成员资格但不关心排序并且不需要集合包含重复对象时使用.An NSSet
不以任何特定顺序存储其对象; 相反,该类明确地设计用于有效地测试对象是否存在于集合中.
同样适用NSCountedSet
,但NSCountedSet
也保留了重复对象的数量.
简而言之:在关注成员资格测试时使用集合,而不是仅保留一组对象(其中一些可能是重复的,由某种isEqualTo
方法决定).
继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会发布一个notification(BuddyListDidAddBuddiesNotification
),其中包含一个在其userInfo中添加了好友的NSSet.因此,观察此内容的UI元素可以以适当的排序顺序将伙伴插入其列表中.这使得列表动画非常容易,如果您在模型层维护所有已排序的版本,这将更加困难.
当你有两个NSSets时,可以很容易地找出它们之间的差异并构造一系列删除并添加到另一个(再次,对于动画有用).使用NSArray执行此操作要复杂得多.
所以我的建议是默认为NSSet.您只应在实际需要订购时使用NSArray.不幸的是,这是大多数人如何做到这一点.