博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSHashTable and NSMapTable
阅读量:4661 次
发布时间:2019-06-09

本文共 2245 字,大约阅读时间需要 7 分钟。

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检查。

如下一个例子:

123456
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为弱引用。

12345
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 。

原文地址:.

转载于:https://www.cnblogs.com/zsw-1993/p/4879219.html

你可能感兴趣的文章
Mysql性能优化一:SQL语句性能优化
查看>>
设置EditText是否可编辑
查看>>
Huginn实现自动通过slack推送豆瓣高分电影
查看>>
javascript构造器模式创建对象
查看>>
linux centos7 文件挂载学习记录
查看>>
INSERT
查看>>
五子棋
查看>>
nodejs中路径问题
查看>>
如何从官网下载STM32固件库(转)
查看>>
Android应用-底部导航栏的使用
查看>>
C#中按模板操作Word —— 如何向Word中插入图片
查看>>
异常,finally,gc
查看>>
git基础操作
查看>>
Java基础之J2EE规范
查看>>
How to Cope with Deadlocks
查看>>
base64上传图片
查看>>
2018/12/05 PAT刷题 L1-015 跟奥巴马一起画方块 Java
查看>>
List小结
查看>>
Windows 7 IIS (HTTP Error 500.21 - Internal Server Error)解决
查看>>
solr中Cache综述
查看>>