NSHashTable 和 NSMapTable学习
今天,在实现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学习的更多相关文章
- NSHashtable and NSMaptable
本文转自Nidom的博客,原文:<NSHashtable & NSMaptable> NSSet, NSDictionary, NSArray是Foundation框架关于集合 ...
- 【转】NSHashtable and NSMaptable
本文转自Nidom的博客,原文:<NSHashtable & NSMaptable> NSSet, NSDictionary, NSArray是Foundation框架关于集合 ...
- NSDictionary和NSMaptable, NSArray,NSSet,NSOrderedSet和NSHashTable的区别
NSSet, NSDictionary, NSArray是Foundation框架关于集合操作的常用类, 和其他标准的集合操作库不同, 他们的实现方法对开发者进行隐藏, 只允许开发者写一些简单的代码, ...
- [转] NSMapTable 不只是一个能放weak指针的 NSDictionary
NSMapTable 不只是一个能放weak指针的 NSDictionary NSMapTable是早在Mac OS X 10.5(Leopard)的引入集合类.乍一看,这似乎是作为一个替换NSDic ...
- NSHashTable NSPointerArray
NSHashTable和NSMapTable能够对持有的对象做strong或weak存储,弱持有weak引用对象,当weak对象释放后会自动从表中移除 http://blog.csdn.net ...
- [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧
简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...
- [转][iOS]NSHashTable & NSMapTable
NSSet and NSDictionary, along with NSArray are the workhorse collection classes of Foundation. Unlik ...
- 想进大厂嘛?这里有一份通关秘籍:iOS大厂面试宝典
1.NSArray与NSSet的区别? NSArray内存中存储地址连续,而NSSet不连续 NSSet效率高,内部使用hash查找:NSArray查找需要遍历 NSSet通过anyObject访问元 ...
- ios NSHashTable & NSMapTable
在ios开发中大家用到更多的集合类可能是像NSSet或者NSDictionary,NSArray这样的.这里要介绍的是更少人使用的两个类,一个是NSMapTable,另一个是NSHashTable. ...
随机推荐
- Servlet 实现文件的上传与下载
这段时间尝试写了一个小web项目,其中涉及到文件上传与下载,虽然网上有很多成熟的框架供使用,但为了学习我还是选择了自己编写相关的代码.当中遇到了很多问题,所以在此这分享完整的上传与下载代码供大家借鉴. ...
- 关于apche无缘无故个启动不了,解决方法
1. 对于用户不小心把apache下的conf文件不小心给修改了,可那会导致,启动不了apache, 解决办法可以重新下载一个, 64为 32位 下载地址 http://www.veryhuo.c ...
- mysql字符串连接,重复等字符串函数总结
mysql concat()函数 MySQL的concat函数可以连接一个或者多个字符串,如 select concat('10'); 输出 10 select concat('11','22','3 ...
- Ubuntu Gnome下如何改动应用的图标icon
我在我机器上安装了一个matlab,但在软件搜索里找不到matlab. 我发现是matlab没有相应的.desktop文件. 顺便我将matlab的图标也改动下.过程例如以下: 1.准备一个icon图 ...
- Swift - iOS中各种视图控制器(View Controller)的介绍
在iOS中,不同的视图控制器负责不同的功能,采用不同的风格向用户呈现信息.下面对各个视图控制器做个总结: 1,标准视图控制器 - View Controller 这个控制器只是用来呈现内容.通常会用来 ...
- uva 10127 - Ones(数论)
题目链接:uva 10127 - Ones 题目大意:给出n,问说者少要多少为1才干够整除n. 解题思路:等于是高精度取模,直到余数为0为止. #include <cstdio> #inc ...
- 时间戳timestamp
1 时间戳 数据库中自动生成的 唯一的 二进制的数据,通常用作给数据表的行添加版本戳的机制. timestamp与时间和日期无关. timestamp存储大小为8字节. 一个数据表只能有一个times ...
- Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)
Acknowledgments I would like to thank Jacob Kjome for reviewing early drafts of this document. His c ...
- 重载new delete操作符是怎么调用的
自定义的new操作符是怎么对英语new 一个对象的?自定义的delete操作符什么情况下得到调用?new一个对象时出现异常需要我操心内存泄露吗?下面的一个例子帮我们解开所有的疑惑. 1. 调用规则 ...
- androidstudio 优化gradle编译效率
androidstuido 使用gradle自己主动构建和编译.有时做少量改动编译须要等待时间过长,近期Erik Hellman编写的Boosting the performance for Grad ...