从 NSDictionary 取值的时候有两个方法,objectForKey: 和 valueForKey:,这两个方法具体有什么不同呢?
先从 NSDictionary 文档中来看这两个方法的定义:
objectForKey: returns the value associated with aKey, or nil if no value is associated with aKey. 返回指定 key 的 value,若没有这个 key 返回 nil.
valueForKey: returns the value associated with a given key. 同样是返回指定 key 的 value。
直观上看这两个方法好像没有什么区别,但文档里 valueForKey: 有额外一点:
If key does not start with “@”, invokes objectForKey:. If key does start with “@”, strips the “@” and invokes [super valueForKey:] with the rest of the key. via Discussion
一般来说 key 可以是任意字符串组合,如果 key 不是以 @ 符号开头,这时候 valueForKey: 等同于 objectForKey:,如果是以 @ 开头,去掉 key 里的 @ 然后用剩下部分作为 key 执行 [super valueForKey:]。
比如:
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"theValue"
forKey:@"theKey"];
NSString *value1 = [dict objectForKey:@"theKey"];
NSString *value2 = [dict valueForKey:@"theKey"];
这时候 value1 和 value2 是一样的结果。如果是这样一个 dict:
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"theValue"
forKey:@"@theKey"];// 注意这个 key 是以 @ 开头
NSString *value1 = [dict objectForKey:@"@theKey"];
NSString *value2 = [dict valueForKey:@"@theKey"];
value1 可以正确取值,但是 value2 取值会直接 crash 掉,报错信息:
Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[<__NSCFDictionary 0x892fd80> valueForUndefinedKey:]: this class is not key value coding-compliant for the key theKey.’
这是因为 valueForKey: 是 KVC(NSKeyValueCoding) 的方法,在 KVC 里可以通过 property 同名字符串来获取对应的值。比如:
@interface Person : NSObject
@property (nonatomic, retain) NSString *name;
@end
...
Person *person = [[Person alloc] init];
person.name = @"fannheyward";
NSLog(@"name:%@", [person name]);
//name:fannheyward
NSLog(@"name:%@", [person valueForKey:@"name"]);
//name:fannheyward
[person release];
valueForKey: 取值是找和指定 key 同名的 property accessor,没有的时候执行 valueForUndefinedKey:,而 valueForUndefinedKey: 的默认实现是抛出 NSUndefinedKeyException 异常。
回过头来看刚才 crash 的例子, [dict valueForKey:@"@theKey"]; 会把 key 里的 @ 去掉,也就变成了 [dict valueForKey:@"theKey"];,而 dict 不存在 theKey 这样的 property,转而执行 [dict valueForUndefinedKey:@"theKey"];,抛出 NSUndefinedKeyException 异常后 crash 掉。
objectForKey: 和 valueForKey: 在多数情况下都是一样的结果返回,但是如果 key 是以 @ 开头,valueForKey: 就成了一个大坑,建议在 NSDictionary 下只用 objectForKey: 来取值。
发表评论
-
IOS开发 多线程 一
2013-11-19 11:46 510原文:http://blog.csdn.net/develo ... -
IOS 学习 Key-value coding
2013-11-19 10:56 838原文:http://blog.csdn.net/develo ... -
IOS block dispatch_queue
2012-11-05 15:04 938研究了3天的block使用,今天终于写出了自己的第一个b ... -
socket编程 详解
2012-08-28 08:57 1110对TCP/IP、UDP ... -
iOS ASIHTTPRequest详解 非常强大
2012-08-27 13:20 2449ASIHTTPRequest对CFNetwork API ... -
今天看了ps的简介,决定一定要把它给学会,首先了解一下基础知识
2012-08-22 00:01 7741.位图图像的概念 位图图像使用像素来表示图像,因此也 ... -
SDWebImage使用,图片加载和缓存
2012-07-04 11:44 2438SDWebImage托管在github上。https:/ ... -
coredata 理解
2012-06-15 13:08 1408昨天开始认真的看coredata的用法,今天终于明白的其中的 ... -
#ifndef、#def、#endif说明
2012-06-13 13:43 900你所遇到的这几个 ... -
ios 数据存储的四种常用方式NSKeyedArchiver/NSUserDefaults/Writ
2012-06-13 10:49 1377OK,今天Himi介绍游戏 ... -
AVAudioPlayer 音频播放器 使用 教程
2012-06-05 14:33 1249IOS中有三种播放音频的方式:AVAudioPlaye ... -
使用iOS手势UIGestureRecognizer
2012-06-05 10:10 1253UIKit中包含了UIGestureRecognizer ... -
NSAutoReleasePool
2012-05-28 14:40 786好记性不如烂博客. 今天需要记录的是关于NSAutoR ... -
NSLocalizedString 实现国际化
2012-05-28 11:23 864一、获取系统所支持的国际化信息 在国际化之前,你可以在ip ... -
自定义 UIColor baseView 父类子类方法名 不能重复
2012-05-24 11:04 868原来是因为方法名字重复了,因为baseview的方法名和 ... -
Android图片处理(Matrix,ColorMatrix)
2012-05-22 09:24 877在编程中有时候需要 ... -
symbol(s) not found for architexture i386 路径错误
2012-05-16 09:55 1578昨天这个错误又出现 ... -
symbol(s) not found for architexture i386 报错
2012-05-15 18:40 772我靠啊,今天下午出现了个这个错误,找了好多资料,发现让添加li ... -
symbol(s) not found for architexture i386 报错
2012-05-15 18:40 0我靠啊,今天下午出现了个这个错误,找了好多资料,发现让添加li ... -
推送 证书 联机调试
2012-05-15 15:16 855联机调试出现问题, ...
相关推荐
### 详尽解析:NSDictionary在Objective-C中的应用与特性 #### 核心概念与功能 `NSDictionary`是Cocoa框架中一个重要的类,用于管理键值对数据集合。它提供了强大的功能来存储、检索和操作数据,是Objective-C中...
在iOS开发中,NSDictionary是Objective-C中的一个核心数据结构,它是Foundation框架的一部分,用于存储键值对(key-value pairs)的数据集合。这个压缩包“NSDictionary.zip”可能包含了一个示例项目或者教学资源,...
在Objective-C中,NSNumber和NSDictionary是两个非常重要的基础类,它们在编程中扮演着不可或缺的角色。即使随着Swift的兴起,Objective-C仍然是许多现有项目和开发者的主要工具,因此了解这两个类的用法至关重要。 ...
在iOS和Objective-C(OC)开发中,NSArray、NSSet和NSDictionary是Foundation框架中的核心数据结构,它们用于存储和管理对象。这些容器类提供了多种方法来操作和访问存储的数据,是编写应用程序时不可或缺的部分。 ...
基于 NSDictionary 的内存缓存,可以识别未保留的值。 特征 线程安全。 检测未使用的对象并删除它们。 在进入背景时删除未使用的对象。 在收到内存警告时删除所有对象。 用法 设置对象 [cache setObject: object...
在Objective-C(OC)编程中,`NSDictionary`是核心数据结构之一,用于存储键值对。这个类提供了在集合中存储不可变对象的方法,并且基于键来访问这些对象。在这个“oc中字典的主要内容”课程中,我们将深入探讨`...
NSDictionary-Accessors 为NSDictionary键入安全访问器,最好与从JSON解析的字典一起使用。 前: id value = nil;value = [dictionary objectForKey:@"id"];if ([value isKindOfClass:[NSNumber class]]) { model....
Objective-C是苹果公司开发的一种面向对象的编程语言,...以上就是Objective-C中NSDictionary和NSMutableDictionary词典对象的主要使用方法,通过这些方法可以高效地处理键值对数据,实现复杂的数据管理与存储需求。
在iOS开发中,Objective-C(简称objc)是主要的编程语言之一,用于构建Apple平台的应用程序。本篇文章将深入探讨如何使用Objective-C读取Plist文件,并将其数据展示在UITableView中,这对于创建用户友好的界面至关...
在iOS开发中,Objective-C是主要的编程语言之一,它提供了丰富的数据结构,如NSArray和NSDictionary,用于存储和处理数据。然而,Objective-C中的这些集合类对null对象(nil)的处理并不友好,直接向数组或字典中...
在Mac OS系统中,开发人员可以利用Cocoa框架与Objective-C(OC)的混合使用来获取电池电量信息。Cocoa是Apple为Mac OS X提供的一种强大的应用程序开发框架,它包括了Objective-C作为主要的编程语言,同时支持C、C++...
在iOS开发中,实现“长按手势拖拽排列顺序并保存记录”的功能涉及到多个关键知识点,主要集中在用户交互(UI)和数据持久化两方面。这里我们将深入探讨这些技术细节。 首先,我们要实现的是长按手势(Long Press ...
NSDictionary * smallDic = [contentDic objectForKey:keyArr[i]]; //获取小字典中得内容 NSString * controllerNameStr = [smallDic objectForKey:@"controllerName"]; //将字符串转化为类名 Class ...
处理方式与数组类似,通过Method Swizzling修改`NSDictionary`的方法,如`objectForKey:`,在执行操作前进行类型检查,避免将nil插入或从字典中取出时出现问题。尤其要注意服务器返回的null数据,需要在使用前进行...
在这个例子中,`manage`和`share`字段在JSON中都是boolean类型,但使用`objectForKey:`方法直接赋值给`BOOL`变量时,由于`NSDictionary`的`objectForKey:`返回的是一个`id`类型(可以是任何对象),所以实际返回的是...
在这个例子中,我们扩展了NSArray和NSDictionary,为它们添加了安全取值的方法。 对于NSArray,常见的越界问题是当尝试访问不存在的索引时。原生的`objectAtIndex:`方法在索引超出范围时会抛出异常。为了防止这种...
在实际应用中,你可能还需要处理键盘动画的过渡效果,以使自定义视图平滑地与键盘一起出现和消失。这可以通过获取键盘显示/隐藏通知中的动画相关信息来实现。 ```objc - (void)keyboardWillShow:(NSNotification *)...
此外,还深入探讨了Objective-C中的几个核心类,如`NSObject`、`NSString`、`NSArray`、`NSSet`和`NSDictionary`等,并对它们的功能和用法进行了详细说明。 #### Interface Builder简介 Interface Builder是一种...
在本节课程中,我们深入探讨了iOS开发中的几个核心概念和技术,特别是针对Foundation框架内的几个关键类进行了详细的讲解。这包括`NSArray`、`NSDictionary`、`NSSet`以及它们的可变版本——`NSMutableArray`、`...
- `NSDictionary` 和 `NSMutableDictionary` 使用 `objectForKey:` 获取键对应的值,如:`id value = [dict objectForKey:key];` - `setValue:forKey:` 用于设置字典中键对应的值(仅限 `NSMutableDictionary`)。...