平时开发中,大部分使用NSSetNSMutableSet。下面介绍个特殊的。

NSHashTable

NSHashTable是更广泛意义的NSSet,区别于NSSet/NSMutableSetNSHashTable有如下特性:

参考: https://nshipster.com/nshashtable-and-nsmaptable/

Hash冲突解决方案:拉链法

使用方法

NSString *str = @"10";
NSHashTable *table = [[NSHashTable alloc] initWithOptions:NSHashTableCopyIn capacity:0];
[table addObject:str];
[table removeObject:str];

NSHashTableOptions介绍(源码中是使用静态常量做关联)

enum {
    // 默认行为,强引用集合中的对象,等同于NSMutableSet
    NSHashTableStrongMemory             = 0,
    // 在将对象添加到集合之前,会拷贝对象
    NSHashTableCopyIn                   = NSPointerFunctionsCopyIn,
    // 使用移位指针(shifted pointer)来做hash检测和确定两个对象是否相等;
    // 同时使用description方法来做描述字符串
    NSHashTableObjectPointerPersonality = NSPointerFunctionsObjectPointerPersonality,
    // 弱引用集合中的对象,且在对象被释放后,会被正确的移除。
    NSHashTableWeakMemory               = NSPointerFunctionsWeakMemory
};
typedef NSUInteger NSHashTableOptions;

NXHashTable

在objc源码中,找到了关于NSHashTable的类似实现。可以参考下

NXHashTable存储结构(精简过)

typedef struct {
    // 附属实体
    const NXHashTablePrototype	*prototype;
    // 真实的长度(存储了多少有效数据)
    unsigned		  count;
    // buckets实际所占用的空间大小(比理论高,2^n,不够会扩容)
    unsigned		  nbBuckets;
    // 数据[HashBucket?]
    void			 *buckets;
    // 信息
    const void	     *info;
} NXHashTable;

NXHashTablePrototype存储结构(精简过)