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. ...
随机推荐
- SimpleAdapter
1.视图 1)主视图 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x ...
- 架构漫谈:UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别
这是一堂关于UML基础知识的补习课:现在我们做项目时间都太紧了,基本上都没有做过真正的class级别的详细设计,更别提使用UML来实现规范建模了:本篇主要就以前自己一直感觉很迷糊的几种class之间的 ...
- asp.net 生成、解析条形码和二维码
原文 asp.net 生成.解析条形码和二维码 一.条形码 一维码,俗称条形码,广泛的用于电子工业等行业.比如我们常见的书籍背面就会有条形码,通过扫描枪等设备扫描就可以获得书籍的ISBN(Intern ...
- Java Arrays Tutorial (3)
Java Arrays Tutorial (3) Data types have a specific set of values. A byte cannot hold a value larger ...
- MVC与WebForm的简单的比较
MVC与WebForm的简单的比较 ASP 强制程序员将业务逻辑和展示页放到一个文件中 WebForm 允许程序员将业务逻辑与页面展示分开到不同的文件中,并且提供强大的开发平台来写 业务逻辑代码 ...
- BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )
对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...
- ADO.NET 操作数据库 --- 01 简单封装
由于我是Java转的C#开始的时候就用的NHihernate,和EF 对ADO.NET使用较少,现在封装一个ADO.NET的工具类来实现数据库的操作,比较简单,望大家多多提意见. 如果大家有什么学习中 ...
- hdu4725 The Shortest Path in Nya Graph
这道题看了下很多人都是把每一层拆成两个点然后建图做的. 我的思路很直接,也不用建图,直接在更新每个点时更新他相邻的边和相邻的层,当然前提是每个点只更新一次,每个层也只更新一次,这样才能确保时间复杂度. ...
- Jetty总览
Jetty入门 基本功能介绍 配置概览-怎么配置Jetty 配置概览-须要配置什么 Jetty配置 部署到Jetty 配置上下文 配置连接器 配置安全 配置JSP支持 Jetty管理指导 启动Jett ...
- Bandwidth内存带宽測试工具
本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/24766015 ----------------- ...