从 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开发教程2010年秋(Lecture 4) 在本节课程中,我们深入探讨了iOS开发中的几个核心概念和技术,特别是针对Foundation框架内的几个关键类进行了详细的讲解。这包括`NSArray`、`...
在iOS应用开发中,`NSUserDefaults` 是一个非常重要的组件,它用于存储用户偏好设置或者轻量级的数据。本源码示例主要讲解如何利用`NSUserDefaults`在iOS应用中进行自定义对象的读取与写入操作。下面将详细阐述`...
在iOS开发中,数据存储是不可或缺的一部分,它涉及到如何持久化应用程序的数据,以便在用户退出应用后仍能保留这些信息。本篇文章将深入探讨iOS应用中的两种主要存储方式:归档(Archiving)和偏好设置(Preference ...
在 iOS 开发中,经常会遇到需要验证用户输入的邮箱格式是否正确的情况。通过使用正则表达式可以有效地完成这一任务。 **代码示例:** ```objective-c -(BOOL)isValidateEmail:(NSString *)email { NSString *...
在iOS开发中,NSDictionary是Objective-C中的一个核心数据结构,它是Foundation框架的一部分,用于存储键值对(key-value pairs)的数据集合。这个压缩包“NSDictionary.zip”可能包含了一个示例项目或者教学资源,...
在iOS开发中,通过POST方式从服务器获取数据是一项常见的任务,尤其当涉及到向服务器发送复杂或大量的参数时。本文将深入解析如何在iOS应用中利用POST请求获取服务器数据,包括构建POST请求、设置请求头、处理响应等...
处理方式与数组类似,通过Method Swizzling修改`NSDictionary`的方法,如`objectForKey:`,在执行操作前进行类型检查,避免将nil插入或从字典中取出时出现问题。尤其要注意服务器返回的null数据,需要在使用前进行...
在iOS开发中,XML(eXtensible Markup Language)是一种常用的数据交换格式,它用于存储和传输结构化数据。GDataXML是Objective-C中的一个库,用于解析XML文档,为iOS开发者提供了方便的API来处理XML内容。这篇博客...
在iOS开发中,当用户需要在输入框中输入文本时,键盘弹出后经常会遮挡到部分屏幕内容,这给用户带来不便。为了解决这个问题,开发者可以使用`KeyboardScrollsView`,这是一种技术,它允许视图随键盘的显示和隐藏自动...
在iOS开发中,页面间的传值是日常开发中不可或缺的一部分,尤其对于Objective-C(简称OC)的开发者来说,掌握各种传值方式能显著提高代码的灵活性和可维护性。本资料"ios-iOS-OC-页面传值的5种方法.zip"主要探讨了五...
在iOS开发中,掌握一些常用的公共方法是提升开发效率的关键。这些方法涵盖了多个领域,包括字符串处理、数组操作、日期格式化、网络请求等。以下将详细介绍这些知识点: 1. **字符串处理**: - `NSString` 的 `...
在iOS开发中,用户偏好(User Defaults)是一个关键的概念,它允许应用程序保存并恢复用户的设置和轻量级数据。在“笨鸟学iOS开发(2)读写用户偏好源代码”这个主题中,我们将深入探讨如何在Objective-C或Swift中...
在iOS、macOS和其他Apple平台的应用开发中,`NSDictionary`被广泛用于各种场景,如配置文件读取、数据持久化、网络数据解析等。 #### 构造与初始化 `NSDictionary`提供多种构造方法,最常见的包括使用字面量语法或...
在iOS开发中,libxml库提供了一种高效且灵活的方式来处理XML文档,这对于那些需要解析或生成XML数据的应用来说至关重要。下面将详细介绍如何在Xcode项目中集成libxml库,并使用它进行XML解析。 1. **集成libxml库**...
在iOS和Objective-C(OC)开发中,NSArray、NSSet和NSDictionary是Foundation框架中的核心数据结构,它们用于存储和管理对象。这些容器类提供了多种方法来操作和访问存储的数据,是编写应用程序时不可或缺的部分。 ...
6. **安全访问对象**:在访问数组、字典等集合对象时,确保索引或键存在,避免`NSArray`的`objectAtIndex:`、`NSDictionary`的`objectForKey:`等方法抛出异常。使用`nil`安全的方法如`NSArray`的`object(at:)`、`...
在iOS开发中,JSON(JavaScript Object Notation)是一种常见的数据交换格式,被广泛用于服务器与客户端之间的通信。JSON因其简洁、易读、易解析的特性,成为移动应用开发者首选的数据格式。本文将深入探讨在iOS环境...
在iOS开发中,数据持久化是一项至关重要的技术,它使得应用程序在关闭或设备重启后仍能保留用户数据。其中,NSUserDefaults是苹果提供的一种轻量级的数据持久化方式,主要用于存储少量的基本数据类型,如字符串、...
在iOS开发中,SoundSwitch是一个重要的工具,它允许开发者检测设备上的静音开关状态。静音开关是iOS设备上一个独特的硬件特性,用户可以快速切换设备的音频输出是否静音。这个功能对于某些应用程序,尤其是那些对...
Foundation框架是iOS开发中的核心库之一,为开发者提供了处理数据、网络、文件管理等基础功能的强大工具集。在iOS 7版本中,该框架包含了一系列重要的类、协议以及函数,用于支持基本的应用程序功能。 #### 二、...