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

如下一个例子:

1
2
3
4
5
6
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为弱引用。

1
2
3
4
5
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 。

原文地址:http://nshipster.com/nshashtable-and-nsmaptable/.

转载于:https://www.cnblogs.com/xincc/p/3680719.html

NSHashTable and NSMapTable相关推荐

  1. [转] NSMapTable 不只是一个能放weak指针的 NSDictionary

    NSMapTable 不只是一个能放weak指针的 NSDictionary NSMapTable是早在Mac OS X 10.5(Leopard)的引入集合类.乍一看,这似乎是作为一个替换NSDic ...

  2. 自己学习Foundation一些类

    一些类 NSDecimalNumber 数字精准计算 NSCache 线程安全的Memory缓存 NSCharacterSet 字符串分割.过滤等 NSEnergyFormatter 以焦耳和卡路里作 ...

  3. swift ~ 2020年 swift面试题

     联系人:石虎 QQ:1224614774  昵称: 嗡嘛呢叭咪哄                       QQ群:807236138  群称: iOS 技术交流学习群               ...

  4. NSMapTable、NSHashTable与NSPointerArray的封装

    NSMapTable.NSHashTable与NSPointerArray的封装 说明 NSMapTable对应NSDictionary:NSHashTable对应NSSet:NSPointerArr ...

  5. SDMemoryCache中的NSMapTable

    带着问题学习L NSMapTable看名字是一个映射表,官方文档描述为:类似于字典的集合,但具有更广泛的可用内存语义. 问题1:NSDictionary内存语义怎么就不广泛了呢? - (void)se ...

  6. NSMapTable

    跟NSDictionary用法差不多,不过区别是NSMapTable可以设置内存选项,例如可以设置key跟value的内存属性(weak/strong),从而避免内存泄露. 例如这个+ weakToW ...

  7. ios5 ARC机制介绍和使用

    参考http://www.yifeiyang.net/development-of-the-iphone-simply-1/ http://blog.csdn.net/diyagoanyhacker/ ...

  8. 技术干货 | iOS 高阶容器详解

    导读:近期,在面试 iOS 工程师的过程中,当我问到候选人小伙伴都了解哪些 iOS 容器类型时,大多数小伙伴能给出的答复就是NSArray.NSDictionary 和 NSSet以及对应的可变类型, ...

  9. iOS之深入解析高阶容器的原理和应用

    一.前言 我们都知道 iOS 提供了三种主要的容器类型,它们分别是 Array.Set 和 Dictionary,用来存储一组值: Array:存储一组有序的值: Set:存储一组无序的.不重复的值: ...

最新文章

  1. 【js】common.jsp的使用
  2. 多继承的构造函数和析构函数
  3. 专家认为自动驾驶汽车需要很多年的五个原因
  4. 山寨SaaS--管理软件夜未眠(五)
  5. 《鸿蒙理论知识05》HarmonyOS概述之下载与安装软件
  6. Oracle中一把梭获取对象DDL创建语句
  7. 炒股要学会向动物学习
  8. String.split()与StringUtils.split()的区别
  9. QT设计师(designer)下载安装
  10. 什么是CMMI能力成熟度模型?企业为什么要做?
  11. j2ee框架之jvn
  12. 飞信死了,运营商也快死了
  13. 盖章php源码,模拟电子签章盖章效果的jQuery插件源码_jquery
  14. Yocto on Quark X1000
  15. Cookie获取问题:ajax方法后端只获取到一个Cookie,Request无法获取到自定义的Cookie
  16. 六十、基础框架(十八)辞典物件
  17. h5页面跳转微信小程序。
  18. springboot高校学习资源共享系统java
  19. 直通车拼多多7天均价比价
  20. 渗透技巧——程序的降权启动

热门文章

  1. luogu4365 秘密袭击 (生成函数+线段树合并+拉格朗日插值)
  2. C语言——生命游戏(初始
  3. Seurat | 单细胞分析工具
  4. WebStorm使用教程
  5. bsgs(Baby Steps Giant Steps)算法
  6. 《程序员在第一季度追姐姐的书》——提升自己的形象气质
  7. 影响中国历史的十篇政治美文
  8. 架构重构改善既有代码的设计
  9. 谈自动化测试与CI中一些常见的谬见
  10. SQL查询中的转义字符