NSHashTable 和 NSMapTable的学习

本文深入探讨了iOS开发中常用的集合类NSHashTable和NSMapTable的功能特性,包括它们与NSSet、NSDictionary的区别,以及如何通过不同内存管理策略灵活使用这些集合类来优化内存管理。
摘要由CSDN通过智能技术生成

今天在实现play gif功能的时候,看到有两个类比较陌生,就在此记录下看到的东西:

NSSet和NSDictionary是两个常用的类,但是他们默认假定了其中对象的内存行为。对于NSSet,object是强引用的,和NSDictionary中的value是一样的。而NSDictionary中的key则是copy的,因此当开发者想要使NSSet的objects或者NSDictionary的values为weak,或者NSDictionary使用没有实现协议的对象作为key时,比较麻烦(需要使用NSValue的方法valueWithNonretainedObject)。

在iOS6和MAC OS X 10.5开始,提供了相对于NSSet和NSDictionary更通用的两个类NSHashTable和NSMapTable。

NSHashTable是比NSSet更通用的一个相似物。NSHashTable相对于NSSet/NSMutableSet有如下特征:

  • NSSet/NSMutableSet对其对象是强引用,使用isEqual方法去检查对象是否相等,使用方法hash去获取hash值。
  • NSHashTable是可变的,没有一个不变的和其对应。
  • NSHashTable可以对其对象是weak引用。
  • NSHashTable可以在输入(加入)的时候copy对象。
  • NSHashTable可以包含任意指针,使用指针去做相等或者hashing检查。
如下面一个例子:
•	NSHashTable *hashTable = [NSHashTable hashTableWithOptions:NSPointerFunctionsCopyIn];	•	[hashTable addObject:@"foo"];	•	[hashTable addObject:@"bar"];	•	[hashTable addObject:@"foo"];	•	[hashTable addObject:@42];	•	NSLog(@"Members: %@", [hashTable allObjects]);
  • NSHashTable使用一个option去初始化,下面是可用的选项:
  • NSHashTableStrongMemory:和NSPointerFunctionsStrongMemory相同,使用此选项为默认的行为,和NSSet的内存策略相同。
  • NSHashTableWeakMemory:和NSPointerFunctionsWeakMemory相同,此选项使用weak存储对象,当对象被销毁的时候自动将其从集合中移除。
  • NSHashTableCopyIn:和NSPointerFunctionsCopyIn相同,此选项在对象被加入到集合之前copy它们。
  • NSHashTableObjectPointerPersonality:和NSPointerFunctionsObjectPointerPersonality相同,此选项是直接使用指针进行isEqual:和hash。
  • NSMapTable和NSDictionary相对应,相对于NSDictionary/NSMutableDictionary,NSMapTable有如下的特征:
  • NSDictionary/NSMutableDictionary会copy对应的key,强引用相应的value。
  • NSMapTable是可变的,没有一个不变的类与其对应。
  • NSMapTable可以对其key和value弱引用,在这种情况下当key或者value被释放的时候,此entry会自动从NSMapTable中移除。
  • NSMapTable在加入一个(key,value)的时候,可以对其value设置为copy。
  • NSMapTable可以包含任意指针,使用指针去做相等或者hashing检查。
  • 下面的NSMapTable例子中,key不是copy的(强引用的),value为弱引用。
id delegate = ...;NSMapTable *mapTable = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableWeakMemory];[mapTable setObject:delegate forKey:@"foo"];NSLog(@"Keys: %@", [[mapTable keyEnumerator] allObjects]);

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

NSMapTableStrongMemory:指定对应的key或者value为强引用。NSMapTableWeakMemory:指定对应的key或者value为弱引用。NSMapTableCopyIn:指定对应的key或者value在加入到集合中的时候为copy。NSMapTableObjectPointerPersonality:此选项是直接使用指针进行isEqual:和hash。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值