今天,在实现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 。

不积跬步无以至千里。闲来无事,搞一个属于自己的小站。假设看到这篇文章感觉对你有帮助的话,就支持关注一下我的小站:我站

版权声明:本文博客原创文章,博客,未经同意,不得转载。

NSHashTable 和 NSMapTable学习的更多相关文章

  1. NSHashtable and NSMaptable

    本文转自Nidom的博客,原文:<NSHashtable & NSMaptable>   NSSet, NSDictionary, NSArray是Foundation框架关于集合 ...

  2. 【转】NSHashtable and NSMaptable

    本文转自Nidom的博客,原文:<NSHashtable & NSMaptable>   NSSet, NSDictionary, NSArray是Foundation框架关于集合 ...

  3. NSDictionary和NSMaptable, NSArray,NSSet,NSOrderedSet和NSHashTable的区别

    NSSet, NSDictionary, NSArray是Foundation框架关于集合操作的常用类, 和其他标准的集合操作库不同, 他们的实现方法对开发者进行隐藏, 只允许开发者写一些简单的代码, ...

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

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

  5. NSHashTable NSPointerArray

    NSHashTable和NSMapTable能够对持有的对象做strong或weak存储,弱持有weak引用对象,当weak对象释放后会自动从表中移除     http://blog.csdn.net ...

  6. [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧

    简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...

  7. [转][iOS]NSHash​Table & NSMap​Table

    NSSet and NSDictionary, along with NSArray are the workhorse collection classes of Foundation. Unlik ...

  8. 想进大厂嘛?这里有一份通关秘籍:iOS大厂面试宝典

    1.NSArray与NSSet的区别? NSArray内存中存储地址连续,而NSSet不连续 NSSet效率高,内部使用hash查找:NSArray查找需要遍历 NSSet通过anyObject访问元 ...

  9. ios NSHashTable & NSMapTable

    在ios开发中大家用到更多的集合类可能是像NSSet或者NSDictionary,NSArray这样的.这里要介绍的是更少人使用的两个类,一个是NSMapTable,另一个是NSHashTable. ...

随机推荐

  1. Vmware虚拟机下三种网络模式配置

    VMware虚拟机有三种网络模式,分别是Bridged(桥接模式).NAT(网络地址转换模式).Host-only(主机模式). VMware workstation安装好之后会多出两个网络连接,分别 ...

  2. SGU 106 The Equation 扩展欧几里得应用

    Sol:线性不定方程+不等式求解 证明的去搜下别人的证明就好了...数学题. #include <algorithm> #include <cstdio> #include & ...

  3. 常见Linux服务器操作系统版本中自带的OpenSSL版本

    下表是常见服务器操作系统版本中自带的OpenSSL版本: 从上表可以看出,目前常用的服务器版本中,默认OpenSSL为1.0.2的只有Ubuntu 16.04 LTS.其他版本如果要升级OpenSSL ...

  4. svn回滚版本1

    我刚开始使用SubVersion时, 想把svn代码库回滚到以前某个版本,  上网找来找去都找不到(那时文档比较少), 让我郁闷了好一阵子.  现在记录一下 SubVersion回滚的方法: 第一种方 ...

  5. 在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编

    在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...

  6. MySQL如何查询LINESTRING数据

    我有一个提交的命名crm_geo_org,具有以下结构 ipoid INTEGER 11 NOT NULL PRIMARY KEY beginip INTEGER 14 NOT NULL UNSIGN ...

  7. android软键盘的管理和属性的设置

    android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...

  8. sql和shell注入测试

    1.整数型参数,必须intval转义,用addslashes转义不行 <?php   $test = $_REQUEST["test"]; $test = addslashe ...

  9. document.body的一些用法以及js中的常见问题

    document.body的一些用法以及js中的常见问题 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight ...

  10. 【学习opencv第六篇】图像的反转操作

    考试终于完了,现在终于有时间可以继续学习这个了.写这篇博客主要是因为以前一直搞不清楚图像数据到底是怎么存储的,以及这个step到底是什么,后来查了一下才知道原来step就是数据行的长度.. #incl ...