平时开发中,大部分使用NSSet和NSMutableSet。下面介绍个特殊的。
NSHashTable是更广泛意义的NSSet,区别于NSSet/NSMutableSet,NSHashTable有如下特性:
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;
在objc源码中,找到了关于NSHashTable的类似实现。可以参考下
NXHashTable存储结构(精简过)
typedef struct {
// 附属实体
const NXHashTablePrototype *prototype;
// 真实的长度(存储了多少有效数据)
unsigned count;
// buckets实际所占用的空间大小(比理论高,2^n,不够会扩容)
unsigned nbBuckets;
// 数据[HashBucket?]
void *buckets;
// 信息
const void *info;
} NXHashTable;
NXHashTablePrototype存储结构(精简过)