NSHashTable and NSMapTable

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux中 likely与unlikely

看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核(我看的是2.6.22.6版本,2.6的版本应该都有)中定义的两个宏。位于…

win10 iis网站服务器,windows10如何搭建IIS服务器

web服务器无处不在,本次教程主要简单介绍一个简单的web服务IIS,IIS主要适用于ASP.NET、ASP等语言使用。1、打开控制面选择程序和功能2、点击启用或关闭windows功能打开一个小框框提供给用户配置相关软件,本次主要打开IIS功能 ,具体…

表格数字乘以百分比怎么算_EXCEL记住这两个快捷键,1秒种设好数字格式

你还在用右键设置单元格格式来设置千分位吗?你还在用右键设置单元格格式来设置百分比吗?今天小马教大家两个快捷键,记住这两个快捷键,1秒钟设好数字格式。设置数字的千分位 CtrlShift1可能这个数字比较难记,可以把1想象…

设备树使用手册

设备树使用手册This page walks through how to write a device tree for a new machine. It is intended to provide an overview of device tree concepts and how they are used to describe a machine.本文将介绍如何为一个新机器编写设备树。我们准备提供一个有关设备树概…

查看服务器文件夹,远程查看服务器文件夹内的文件夹

远程查看服务器文件夹内的文件夹 内容精选换一换请使用Mind Studio的安装用户进行升级操作,在升级前请先登录到后台服务器,切换到root用户在/usr/bin目录下执行./add_sudo.sh username脚本进行加权操作,使用命令为:界面参数解释如…

linux tao环境 安装_Linux安装jdk8及环境变量配置

众所周知,Java项目部署到Linux服务器运营是需要Java运行环境jdk的,接下来我就总结一下我自己的见解(如有意见、建议欢迎各位指教)。前言:搭建环境,所需要的安装包、工具例如:Xshell、FileZilla、…

A5D2 GPIO测试

1. 首先构建设备树,此例中,测试两个GPIO管脚,一个做输入中断,一个做输出 每个GPIO需要分别描述,其中,label随意,pioA后面的数字,可以在sama5d2-pinfunc.h文件中找到 这是管脚功能复用…

易飞erp怎么修改服务器ip,易飞连接失败处理方法

●问题描述:所有客户端登陆易飞报错:LeaderWorkCenterADO连接失败1.确认SQL Server的sa密码和易飞系统控制管理员的密码是否一致,重新授权一下;基本就可以解决问题啦!2.如果还是不行,检查一下数据源中是否有…

中如何计算工龄_在Substrate中如何计算交易权重

建议在阅读本文之前,先掌握关于Substrate中交易费用设计的基本概念。如果还没有了解的童鞋,请移步: Kaichao:Substrate 区块链应用的交易费用设计​zhuanlan.zhihu.com读完Substrate区块链应用的交易费用设计的小伙伴,…

wince 6.0 pb

1)删除目录C:/Program Files/Microsoft Platform Builder/6.00下的EtkRemov.inf文件 2)修改系统时间到未来某个时间点 3)新建一个文本文档 4)重命名新建文本文档为EtkRemov.inf 5)改回系统时间

安卓文件共享服务器,安卓文件共享云服务器

安卓文件共享云服务器 内容精选换一换华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。内网环境下,Windows云服务器之间怎样实现文件夹共…

linux curl命令验证服务器断点续传支持

有个同事说,发现现在对外下载安装包的服务器不支持断点续传,我听了一阵纳闷,lighttpd server对于静态文件应该默认支持断点续传的,登机器查看lighttpd配置文件发现 对断点续传的支持被禁用了,lighttpd的说明里对该配置…

代码补全_AI加持,Kite增加智能代码补全功能:减少一半操作,实时补全

代码补全工具 Kite 近日更新了最新的版本,增加了名为「Intelligent Snippets」的新功能。这一功能可以帮助开发者更为智能和高效的补全 Python 代码中的函数命令了。机器之心报道,机器之心编辑部。Kite 是一个著名的 Python 代码补全工具,支持…

Linux workqueue工作原理

1. 什么是workqueue Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然…

微信获取token服务器处理,微信硬件平台(九) 自己的服务器从微信获取token并保存txt...

1安装crontab:yum install crontabs说明:service crond start //启动服务service crond stop //关闭服务service crond restart //重启服务service crond reload //重新载入配置查看crontab服务状态:service crond status手动启动crontab服务&#xff1a…

Tomcat项目部署过程中的问题

1.项目发布问题 将发布的war包放置在webapp下时,点击bin目录中的startup.bat时,出现黑框一闪, 采用cmd登录时出现 The JRE_HOME environment variable is not defined correctly 2.问题是环境变量没有配置好 下面进行系统的配置(前…

centos8 默认nginx路径_CentOS 8系统安装Nginx Web服务器及常见配置过程

Nginx是一种快速、轻量级的Web服务器,优势是Nginx的配置文件非常简单易用。它是Apache Web服务器的绝佳替代品。在本文中,惠主机将简单介绍如何在CentOS 8上安装Nginx Web服务器和常见基本配置过程。安装NginxNginx在CentOS 8的官方软件包存储库中可用。…

思科模拟服务器怎么写文件,思科模拟服务器配置教程

思科模拟服务器配置教程 内容精选换一换部署游戏应用前,您需要准备硬件以及华为云的环境,主要包括以下内容:硬件环境:您需要准备一台带有显卡的Windows机器,硬盘至少20G,用于运行游戏客户端。若您不需要运行…

vs2013编译osg缺少mfc120d.lib

因为MFC MBCS DLL缺少导致的,微软的解释如下(http://msdn.microsoft.com/en-us/library/dn251007.aspx): MFC libraries (DLLs) for multibyte character encoding (MBCS) are no longer included in Visual Studio, but are avai…

【转载】MongoDB 1000W级数据 Insert和Query和Delete性能测试

加索引测试: > db.users.getIndexes() [ { "name" : "_id_", "ns" : "test.users", "key" : { "_id" : …