Objective-C中字典的使用方法总结
在Objective-C中提供了两个类来实现字典,即NSDictionary和NSMutableDictionary。其中,NSMutableDictionary是NSDictionary的子类,它继承父类方法的同时又支持对数据进行插入和删除操作,它们共同实现了以“键值对”的方式存储数据。
// Objective-C中实现的字典相比于其他语言而言,还有一个最大的不同:即同一个字典中可以保存不同类型的对象。
字典类的存在就是为了解决大量数据中的查找问题,因为它是通过key直接找到value的,所以速度极快,避免了遍历所造成的效率低下问题。
1 NSDictionary
1.1 创建不可变字典
可以使用类方法dictionaryWithObjectsAndKeys:创建并初始化字典,示例如下:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"val1", @"key1",
@"val2", @"key2", nil];
注意:在使用键值对初始化字典时,“值”在前,“键”在后,成对出现,各个参数之间使用逗号分隔,并且最后使用nil结束。使用以上方法创建的字典内存分布如下图所示:

1.2 获取字典大小
在执行字典操作之前,常常需要获取字典大小,也就是确定字典中“键值对”的数量,我们可以使用count消息,使用方法如下:
int cnt = [dict count];
该方法会返回一个NSInteger类型的变量,我们也可以直接使用int类型的变量接收。
1.3 得到字典中所有的KEY
对字典发送keyEnumerator消息可以返回一个枚举对象,其中存储了字典中所有的键:
NSEnumerator *enumKeys = [dict keyEnumerator];
for (NSObject *obj in enumKeys){
NSLog(@"enumKey: %@", obj);
}
使用“for-in”语法可以实现可枚举对象的遍历,以上代码中的循环可以遍历所有键,并且输出:
-- ::11.873 OCTest[:] enumKey: key1
-- ::13.753 OCTest[:] enumKey: key2
注意:如果我们直接使用"for-in"语法遍历字典对象,实际上也相当于对“键”的遍历。
for (NSObject *obj in dict){
NSLog(@"key in dict: %@", obj);
}
执行以上代码的输出为:
-- ::17.590 OCTest[:] key in dict: key1
-- ::17.590 OCTest[:] key in dict: key2
1.4 遍历字典中的所有VALUE
可以使用获取“键”类似的方法获取字典中的“值”,只需要对字典发送objectEnumerator消息即可:
NSEnumerator *enumValues = [dict objectEnumerator];
for (NSObject *obj in enumValues){
NSLog(@"value in dict: %@", obj);
}
运行结果如下:
-- ::41.984 OCTest[:] value in dict: val1
-- ::41.984 OCTest[:] value in dict: val2
1.5 根据KEY检索VALUE
对于字典而言,最常见的操作就是查找了,也就是根据给定的KEY,检索对应的VALUE,方法如下:
NSObject *value = [dict objectForKey:@"key1"];
if (value != nil){
NSLog(@"value in dict: %@", value);
}
运行结果如下:
-- ::09.012 OCTest[:] value in dict: val1
2 NSMutableDictionary
2.1 创建可变字典
可变字典,就意味着我们可以在后续操作过程中向字典中添加或者删除“键值对”,因此,最开始的时候我们可以创建一个空字典,常用的方法有:
NSMutableDictionary *mdict = [@{} mutableCopy];
NSMutableDictionary *mdict = [NSMutableDictionary dictionary];
以上两种方法都可以创建一个空的可修改字典。但是,后续再向其中追加数据时,需要不断的分配内存(懒汉模式)。当然,如果我们能够预知字典的规模,那么可以在创建它的时候就初始化它的大小(饿汉模式):
NSMutableDictionary *mdict = [NSMutableDictionary dictionaryWithCapacity:];
以上方法也会创建一个空字典,但是不同之处在于它已经提前分配了足以容纳10个键值对内容的内存。
注:因为NSMutableDictionary是NSDictionary的子类,当然也可以用它父类的dictionaryWithObjectsAndKeys:方法来创建可变字典。
2.2 向字典中添加数据
[mdict setObject:@"mval01" forKey:@"mkey01"];
[mdict setObject:@"mval02" forKey:@"mkey02"];
因为字典是无序的,因此不用指定插入的位置。如果字典中已经存在对应的KEY值,那么就直接替换掉该KEY对应的值,也就是相当于修改操作;如果不存在,则将该“键值对”添加到字典当中。
2.3 删除字典中的数据
[mdict removeObjectForKey:@"mkey01"];
可以指定“键”的方式删除字典中对应的“键值对”,如果该Key不存在,则不做任何操作。你也可以使用下面的方法清空整个字典的数据:
[mdict removeAllObjects];
Objective-C中字典的使用方法总结的更多相关文章
- python中字典常用的方法
#定义一个空字典: a={ } 定义一个字典: d={'age':18} #增加一个元素: d['age']=20 d[k]=v d.setdefault('age',18) d.setde ...
- python中字典dict pop方法
首先引用下pythondoc pop(key[, default]) If key is in the dictionary, remove it and return its value, else ...
- python中字典内置方法
- Python中多个列表与字典的合并方法
Python中多个列表与字典的合并方法 1多列表的合并 1)a+=b a=['] b = ['] a += b print(a) >>>['] 2) a.extend(b) a=[' ...
- Python中字典get方法的使用
Python中字典get方法的使用 说起来,这个功能是否需要学习还真是有待于讨论.其实,知道了字典这种数据结构以后,通过最基本的Python功能也能够实现一个类似的功能.不过,既然内置了这个功能那么我 ...
- Python中字典合并的四种方法
字典是Python语言中唯一的映射类型.映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表.字典对象是可变的,它是一个容器类型,能存储任意个数的 ...
- OC中如何把数组中字典的数据转换成URL?
在使用objective-c语言开发iOS应用中,会向服务器通过URL请求一些数据,因此对URL的拼接肯定少不了.而在iOS中,我们一般是通过将字典中的数据拼接成我们要请求的URL字符串,那这个是怎么 ...
- 理解Objective C 中id
什么是id,与void *的区别 id在Objective C中是一个类型,一个complier所认可的Objective C类型,跟void *是不一样的,比如一个 id userName, 和vo ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
随机推荐
- 简约之美Jodd-http--应用一箩筐
Jodd-http是一个微型的.简约的http client,然而简单而且方便.使用它可以轻松的实现发送请求和读取响应.它的目标就是日常应用变的非常简单,从而简化开发人员的工作. 了解Jodd-htt ...
- Linux编程之《只运行一个实例》
概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...
- 1.5.3 什么是Tokenizer-分词
什么是Tokenizer-分词 分词器的工作就是分解文本流成词(tokens).在这个文本中,每一个token都是这些字符的一个子序列.一个分析器(analyzer)必须知道它所配置的字段,但是tok ...
- HttpSolrServer-采用静态工厂方法,创建HttpSolrServer单实例
HttpSolrServer线程安全,如果使用下面构造器,必须对所有的请求重用相同的实例.如果实例在运行中创建的,它可能会导致连接泄漏.推荐的做法就是保持每个solr服务url的HttpSolrSer ...
- IOS 区分缓存 内存 物理存储 逻辑存储
1. 存储器分为内部存储器(内存)和外部存储器(外存). ①内存 内存是电脑内部临时存放数据的地方,供CPU直接读取,存放在其中的数据要靠电来维持,一旦断电就会丢失.因此,在操作电脑时,应及时地将需要 ...
- input的button和submit的区别
故事由来: 其实这个问题,昨天已经遇到过,但是昨天是公司的一枚老员工帮助我这个实习生调的,而且我也确(猜)定(测)那枚老员工也不知道这个区别.然后今天又遇到相同问题. 故事梗概: 现在公司里面做一个项 ...
- C# 枚举绑定到ComboBox
来自:http://blog.csdn.net/crazy_frog/article/details/7705442 方法一: 绑定 enum TestEnum {zero=0,one=1,two=2 ...
- 【阿里云产品公测】PTS压力测试WP站搜索
[阿里云产品公测]PTS压力测试WP站搜索 作者:阿里云用户cnsjw PTS性能测试服务是一个非常非常强大的压力测试工具.可以模拟百人同时访问网站的情况,并监测ECS和RDS的各项指标,生成非常详细 ...
- 【Java/Android性能优3】Android性能调优工具TraceView使用介绍
本文转自:http://blog.csdn.net/innost/article/details/9008691 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是 ...
- Mybatis源码解析(一)(2015年06月11日)
一.简介 先看看Mybatis的源码结构图,Mybatis3.2.7版本包含的包共计19个,其他版本可能会少. 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为 ...