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. ...
随机推荐
- BZOJ 1475: 方格取数( 网络流 )
本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...
- 开源软件实践之linux高性能服务器编程框架和选型
很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目.但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件 ...
- Linux下Nginx+tomcat应用系统性能优化
软件环境及服务器配置如下: Linux rh6.3,Tomcat7.0.29,Nginx1.2.7 mysql5.1,jdk1.6.0 mysql5.1 memcached 1.4.15 Xeno 2 ...
- 小记:css特殊性
今天早上遇到了个小bug,刚好用从css权威指南学到的知识解决了 html结构 <ul class="portlet-nav"> <li><a id= ...
- JVM参数说明(转)
做了这么多年java,自以为算是熟悉,其实还差得远,啥也别说了,还是踏踏实实地学吧.今天总结一下常用的JVM的启动参数. 参数类别 参数项 说明 标准参数(-,所有的JVM实现都必须实现这些参数的功能 ...
- 京香julia_百度百科
京香julia_百度百科 京香julia
- ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables opt
mysql跳过权限: mysqld -nt --skip-grant-tables opt 登录:mysql -uroot -p 修改root密码 set password for 'root'@'l ...
- ./ . 和#!/bin/bash 辨析Linux如何选择当前执行脚本的shell
最近遇到一个有趣的问题,让我搞清楚Linux如何选择当前执行脚本的shell 执行cts的的 media stress test 需要安装 android-cts-media-1.0.zip 把这个文 ...
- iOS "The sandbox is not in sync with the Podfile.lock"解决方式
更新Cocoapod之后出现故障: diff: /../Podfile.lock: No such file or directory diff: Manifest.lock: No such fil ...
- poj 百练 2765 八进制小数(精度问题)
2765:八进制小数 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB 描写叙述 八进制小数能够用十进制小数精确的表示.比方,八进制里面的0.75等于十进制里 ...