NSHashTable与NSMapTable

2,518 阅读2分钟

options

NSHashTable与NSMapTable均需要通过option取初始化,而option都是NSPointerFunctionsOptions类型的枚举

常用的枚举如下所示:

NSHashTableStrongMemory、NSPointerFunctionsStrongMemory相同,使用此选项为强引用对象,和NSSet的内存策略相同。

NSHashTableWeakMemory、NSPointerFunctionsWeakMemory相同,此选项使用weak存储对象,当对象被销毁的时候自动将其从集合中移除。

NSHashTableCopyIn、NSPointerFunctionsCopyIn相同,此选项在对象被加入到集合之前copy它们。

NSHashTableObjectPointerPersonality、NSPointerFunctionsObjectPointerPersonality相同,此选项是直接使用指针进行isEqual:和hash。

NSHashTable

NSHashTable与NSSet/NSMutableSet相似,相对于NSSet/NSMutableSet有如下特征:

NSSet/NSMutableSet对其对象是强引用,使用isEqual方法去检查对象是否相等,使用方法hash去获取hash值。

NSHashTable只有可变的,没有一个不变的和其对应。

NSHashTable可以对其对象是weak引用。

NSHashTable可以在加入的时候copy对象。

NSHashTable可以包含任意指针,使用指针去做相等或者hashing检查。

其创建案例如下:

枚举值为弱引用,并且哈希用指针进行isEqual和hash
[[NSHashTable alloc] initWithOptions:NSPointerFunctionsWeakMemory|NSPointerFunctionsObjectPointerPersonality capacity:0];

常用属性和方法如下

@property (readonly) NSUInteger count; //集合内元素数量

- (nullable ObjectType)member:(nullable ObjectType)object; //查看是否存在某个对象

- (NSEnumerator<ObjectType> *)objectEnumerator;	//object的枚举器遍历器

- (void)addObject:(nullable ObjectType)object;//加入一个对象,会处理重复

- (void)removeObject:(nullable ObjectType)object; //删除指定对象

NSMapTable

NSMapTable与NSDictionary/NSMutableDictionary相似,相对于NSDictionary/NSMutableDictionary有如下特征:

NSDictionary/NSMutableDictionary会copy对应的key,强引用相应的value。

NSMapTable是可变的,没有一个不变的类与其对应。

NSMapTable可以对其key和value弱引用,在这种情况下当key或者value被释放的时候,此entry会自动从NSMapTable中移除。

NSMapTable在加入一个key、value的时候,可以对其key、value设置为copy。

NSMapTable可以包含任意指针,使用指针去做相等或者hashing检查。

NSMapTable对象在初始化的时候使用options去分别指定keys和values的行为。

其创建案例如下:

//两个枚举分别是key和value的枚举类型,其中key为强引用,并且哈希用指针进行isEqual和hash,value为弱引用,并且哈希用指针进行isEqual和hash
[NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory|NSPointerFunctionsObjectPointerPersonality valueOptions:NSMapTableWeakMemory|NSPointerFunctionsObjectPointerPersonality];

常用属性和方法如下

- (nullable ObjectType)objectForKey:(nullable KeyType)aKey; //根据key查找某个对象

- (void)removeObjectForKey:(nullable KeyType)aKey; //根据key删除某个对象

- (void)setObject:(nullable ObjectType)anObject forKey:(nullable KeyType)aKey;   // add/replace value (CFDictionarySetValue, NSMapInsert) //加入key-value格式内容

@property (readonly) NSUInteger count;//数量

- (NSEnumerator<KeyType> *)keyEnumerator; //key的枚举器遍历器

- (nullable NSEnumerator<ObjectType> *)objectEnumerator; //object的枚举器遍历器

- (void)removeAllObjects; //删除所有对象

最后

多一点知识,多一点技巧,在完成一些功能时,相信它能给你带来一些帮助