`
sunqichao
  • 浏览: 28642 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

objectForKey与valueForKey在NSDictionary中的差异

    博客分类:
  • IOS
阅读更多

从 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: 来取值。

分享到:
评论

相关推荐

    NSDictionary帮助文档

    ### 详尽解析:NSDictionary在Objective-C中的应用与特性 #### 核心概念与功能 `NSDictionary`是Cocoa框架中一个重要的类,用于管理键值对数据集合。它提供了强大的功能来存储、检索和操作数据,是Objective-C中...

    NSDictionary.zip

    在iOS开发中,NSDictionary是Objective-C中的一个核心数据结构,它是Foundation框架的一部分,用于存储键值对(key-value pairs)的数据集合。这个压缩包“NSDictionary.zip”可能包含了一个示例项目或者教学资源,...

    Objective-C中NSNumber与NSDictionary的用法简介

    在Objective-C中,NSNumber和NSDictionary是两个非常重要的基础类,它们在编程中扮演着不可或缺的角色。即使随着Swift的兴起,Objective-C仍然是许多现有项目和开发者的主要工具,因此了解这两个类的用法至关重要。 ...

    NSArray,NSSet,NSDictionary超详细用法说明

    在iOS和Objective-C(OC)开发中,NSArray、NSSet和NSDictionary是Foundation框架中的核心数据结构,它们用于存储和管理对象。这些容器类提供了多种方法来操作和访问存储的数据,是编写应用程序时不可或缺的部分。 ...

    ISMemoryCache:基于 NSDictionary 的内存缓存

    基于 NSDictionary 的内存缓存,可以识别未保留的值。 特征 线程安全。 检测未使用的对象并删除它们。 在进入背景时删除未使用的对象。 在收到内存警告时删除所有对象。 用法 设置对象 [cache setObject: object...

    oc中字典的主要内容

    在Objective-C(OC)编程中,`NSDictionary`是核心数据结构之一,用于存储键值对。这个类提供了在集合中存储不可变对象的方法,并且基于键来访问这些对象。在这个“oc中字典的主要内容”课程中,我们将深入探讨`...

    NSDictionary-Accessors:为NSDictionary键入安全访问器,最好与从JSON解析的字典一起使用

    NSDictionary-Accessors 为NSDictionary键入安全访问器,最好与从JSON解析的字典一起使用。 前: id value = nil;value = [dictionary objectForKey:@"id"];if ([value isKindOfClass:[NSNumber class]]) { model....

    Objective-C词典对象的使用总结

    Objective-C是苹果公司开发的一种面向对象的编程语言,...以上就是Objective-C中NSDictionary和NSMutableDictionary词典对象的主要使用方法,通过这些方法可以高效地处理键值对数据,实现复杂的数据管理与存储需求。

    objc 读取Plist文件并显示在UITableView中

    在iOS开发中,Objective-C(简称objc)是主要的编程语言之一,用于构建Apple平台的应用程序。本篇文章将深入探讨如何使用Objective-C读取Plist文件,并将其数据展示在UITableView中,这对于创建用户友好的界面至关...

    NilSafe分类

    在iOS开发中,Objective-C是主要的编程语言之一,它提供了丰富的数据结构,如NSArray和NSDictionary,用于存储和处理数据。然而,Objective-C中的这些集合类对null对象(nil)的处理并不友好,直接向数组或字典中...

    获取mac电池电量

    在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 ...

    解决iOS中常见的几种Crash1

    处理方式与数组类似,通过Method Swizzling修改`NSDictionary`的方法,如`objectForKey:`,在执行操作前进行类型检查,避免将nil插入或从字典中取出时出现问题。尤其要注意服务器返回的null数据,需要在使用前进行...

    详解iOS开发中解析JSON中的boolean类型的数据遇到的问题

    在这个例子中,`manage`和`share`字段在JSON中都是boolean类型,但使用`objectForKey:`方法直接赋值给`BOOL`变量时,由于`NSDictionary`的`objectForKey:`返回的是一个`id`类型(可以是任何对象),所以实际返回的是...

    OC Extension SafeObject(防止数组字典取值越界).zip

    在这个例子中,我们扩展了NSArray和NSDictionary,为它们添加了安全取值的方法。 对于NSArray,常见的越界问题是当尝试访问不存在的索引时。原生的`objectAtIndex:`方法在索引超出范围时会抛出异常。为了防止这种...

    将UIView加载到键盘上面

    在实际应用中,你可能还需要处理键盘动画的过渡效果,以使自定义视图平滑地与键盘一起出现和消失。这可以通过获取键盘显示/隐藏通知中的动画相关信息来实现。 ```objc - (void)keyboardWillShow:(NSNotification *)...

    iPhone Application Programming L02: Interface Builder

    此外,还深入探讨了Objective-C中的几个核心类,如`NSObject`、`NSString`、`NSArray`、`NSSet`和`NSDictionary`等,并对它们的功能和用法进行了详细说明。 #### Interface Builder简介 Interface Builder是一种...

    斯坦福大学开放课程:iOS开发教程2010年秋(Lecture 4)

    在本节课程中,我们深入探讨了iOS开发中的几个核心概念和技术,特别是针对Foundation框架内的几个关键类进行了详细的讲解。这包括`NSArray`、`NSDictionary`、`NSSet`以及它们的可变版本——`NSMutableArray`、`...

    iOS 常用公共方法

    - `NSDictionary` 和 `NSMutableDictionary` 使用 `objectForKey:` 获取键对应的值,如:`id value = [dict objectForKey:key];` - `setValue:forKey:` 用于设置字典中键对应的值(仅限 `NSMutableDictionary`)。...

Global site tag (gtag.js) - Google Analytics