NSMutableDictionary中的小坑与初始化方法详解

今天来讲NSMutableDictionary这个基础,是因为在今天的开发中遇到了一个小小的坑,当发现了这个问题后,着实觉得很不应该,所以在这里做一个记录,也同时同他人分享,少走我的弯路。本案例代码上传至 https://github.com/chenyufeng1991/InitNSMutableDictionary  。

今天遇到的问题是这样的,某个方法返回两种结果,NSMutableDictionary或者nil,当然我是用NSMutableDictionary类型来接收返回值。当我要对这个返回值操作时,比如setValue插入数据的时候,发现键值对怎么都不能赋值,顿时让人很不爽。

当然解决这个问题也是很简单的,问题就是无法对一个值为nil的NSMutableDictionary对象插入值,也就是setValue无效。下面我们看两种情况:

(1)当调试程序时,如果发现NSMutableDictionary对象的类型是(NSMutableDictionary*),并且值为nil的时候,是无法setValue的。

(2)如果发现NSMutableDictionary对象类型是(_NSDictionaryM *)时,并且值为 0 key/value pairs时,才可以setValue插入。

注意可变字典没有类似add ,insert方法,插入数据的方法就是setValue。而且相同的“键”只会被插入一次。

小小的坑作了说明以后,本文就来对NSMutableDictionary的初始化方法做一个较为全面的了解。需要注意的是,NSMutableDictionary的初始化方法主要分为两类,实例方法初始化和类方法初始化。两者基本上是一一对应的关系,也是类似的。

(1)

    /**(1)
     *  这样没有对可变字典进行初始化,也没有任何的意义。也无法使用setValue插入数据。也就是说值为nil的可变字典一般不用。
     在调试的时候可以看到,当可变字典类型为(NSMutableDictionary *)nil  时,无法使用setValue插入键值对。
     */
    NSMutableDictionary *dic = nil;

(2)

 /**(2)
     以上两种初始化方法一样。观察调试的时候可以发现,当可变字典为  (_NSDictionaryM *) 0 key/value pair ,零个键值对的时候可以setValue插入数据。
     */
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    NSMutableDictionary *dic02 = [[NSMutableDictionary alloc] initWithCapacity:1];

(3)

    /**(3)
     这种初始化方法其实不推荐,这是隐式的使用 [value,key],[value,key]的方式来构造键值对。
     */
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"11",@"2",@"22",nil];

(4)

 /**(4)
     使用另一个可变字典来初始化某个字典。
     */
    NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] init];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary: dic2];

(5)

 /**(5)
     *  分别使用两个数组来初始化可变字典,一个数组是“键”数组,另一个数组是“值”数组。初始化后键值对会一一进行匹配。
     */
    NSArray *valueArray = @[@"value01",@"value02”,@“value03"];
    NSArray *keyArray = @[@"key01",@"key02",@"key03"];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithObjects:valueArray forKeys:keyArray];

上面的是实例方法初始化,下面的是类方法初始化

(6)

  /**(6)
     *  直接使用类方法初始化。等同于上述(2)。
     */
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    NSMutableDictionary *dic1 = [NSMutableDictionary dictionaryWithCapacity:1];

(7)

 /**(7)
     *  等同于上述(3)
     */
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"1",@"11",@"2",@"22",nil];

(8)

 /**(8)
     *  直接使用某个键值对初始化字典
     */
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObject:@"1" forKey:@"11"];

(9)

 /**(9)
     等同于上述(4)
     */
    NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] init];
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:dic2];

(10)

 /**
     *  等同于上述(5)
     */
    NSArray *valueArray = @[@"value01",@"value02",@"value03"];
    NSArray *keyArray = @[@"key01",@"key02",@"key03"];
    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
时间: 2024-11-06 15:38:01

NSMutableDictionary中的小坑与初始化方法详解的相关文章

PDO中获取结果集之fetchColumn()方法详解

fetchCloumn()方法是获取结果集中下一行指定列的值,从结果集中的下一行返回单独的一列.直线电机品牌 那么我们在前面两篇文章<PDO中获取结果集之fetchAll()方法详解>和<PDO中获取结果集之fetch()方法详解>中我们介绍了两种类似的PDO中获取结果集的方法,那么我们接下来跟大家介绍fetchColumn()方法! 下面我们先看下fetchColumn()方法的语法格式如下: 1 string PDOStatement::fetchColumn ([ int $

PDO中获取结果集之fetchAll()方法详解

fetchAll()方法是获取结果集中的所有行,返回一个包含结果集中所有行的二进制数组!大理石机械构件维修厂家 那么在上一篇<PDO中获取结果集之fetch()方法详解>中,我们介绍了fetch()方法获取结果集,我们今天将要介绍的fetchAll()方法与上一个方法fetch()类似,但是该方法只需要调用一次就可以获取结果集中的所有行,并赋给返回的数组(二维). fetchAll()方法的语法格式如下: 1 array PDOStatement::fetchAll ([ int $fetch

HTML中javascript的&lt;script&gt;标签使用方法详解

原文地址:HTML中javascript的<script>标签使用方法详解 只要一提到把JavaScript放到网页中,就不得不涉及Web的核心语言--HTML.在当初开发javascript的时候,Netscape要解决的一个重要问题就是如何做到让JavaScript既能与HTML页面共存,又不影响那些页面在其他浏览器中的呈现效果.经过尝试.纠错和争论,最终的决定就是为Web增加统一的脚本支持.而Web诞生早期的很多做法也都保留了下来,并被正式纳入HTML规范当中. <script&g

php中static静态变量的使用方法详解

php中的变量作用范围的另一个重要特性就是静态变量(static 变量).静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果. 看看下面的实例: 复制代码 代码如下: <?php function Test() { $w3sky = 0; echo $w3sky; $w3sky++; } ?> 本函数每次调用时都会将 $w3sky 的值设为 0 并输出 "0".将变量加一的 $w3sky++ 没有其到效果,因为一旦退出

javascript中的字符串编码、字符串方法详解

js中的字符串是一种类数组,采用UTF-16编码的Unicode字符集,意味字符串的每个字符可用下标方式获取,而每个字符串在内存中都是一个16位值组成的序列.js对字符串的各项操作均是在对16位值进行操作,而非字符. 在js中"\"后面的第一个字符不会被解析为字符,这就是js的转义字符: \o NUL字符 \b 退格符 \t 水平制表符 \n 换行符 \v 垂直制表符 \f 换页符 \r 回车符 \" 双引号 \' 撇号或单引号 \\ 反斜线 \xXX 由两位十六进制数xx指

Ajax中解析Json的两种方法详解

eval();  //此方法不推荐 JSON.parse();  //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name":"周星驰","age":23 }' var jsonObj = eval( '(' + jsonDate + ')' );  // eval();方法 var jsonObj = JSON.parse( jsonDate );  // JSON.parse();

Linux中监控命令top命令使用方法详解

收集了两篇关于介绍Linux中监控命令top命令的详细使用方法的文章.总的来说,top命令主要用来查看Linux系统的各个进程和系统资源占用情况,在监控Linux系统性能方面top显得非常有用,下面就是我收集的关于Linux top命令的文章,希望能帮到大家 top作为日常管理工作中最常用也是最重要的Linux 系统监控工具之一,可以动态观察系统进程状况.top命令显示的项目很多,默认值是每5秒更新一次,按q键可以退出.显示的各项目为:-b : 批次模式运行.-c : 显示执行任务的命令行.-d

android canvas中rotate()和translate()两个方法详解

rotate()和translate() 1.看到这个题目的时候,有人会觉得这不就是一个对画布的旋转和平移的嘛,但是其中的细节的地方还是需要深究一下的. 例如:有个需求将TextView的文字竖直显示. 首先想到的方法就是将画布旋转90度,代码如下: 1 public class RotateTextView extends TextView { 2 public RotateTextView(Context context) { 3 super(context); 4 } 5 6 public

PDO中获取结果集之fetch()方法详解

fetch()方法获取结果集中的下一行数据,该函数的具体语法格式如下:大理石平台检定规程 1 mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] ) 参数 fetch_style:控制结果集的返回方式,其中可选择的值如下表: 值 说 明 PDO::FETCH_ASSOC 关联数组形式. PDO::FE