从 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:]
。
比如:
1 2 3 4 |
|
这时候 value1
和 value2
是一样的结果。如果是这样一个 dict:
1 2 3 4 |
|
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 同名字符串来获取对应的值。比如:
KVC get property value
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
valueForKey:
取值是找和指定 key 同名的 property accessor,没有的时候执行 valueForUndefinedKey:
,而 valueForUndefinedKey:
的默认实现是抛出 NSUndefinedKeyException
异常。参考Getting Attribute Values Using Key-Value Coding
回过头来看刚才 crash 的例子, [dict valueForKey:@"@theKey"]
(如果不存在这个key,会返回nil,但@"thekey"会返回nil);
会把 key 里的 @ 去掉,也就变成了 [dict valueForKey:@"theKey"];
,而 dict 不存在 theKey
这样的 property,转而执行 [dict valueForUndefinedKey:@"theKey"];
,抛出 NSUndefinedKeyException
异常后 crash 掉。
objectForKey:
和 valueForKey:
在多数情况下都是一样的结果返回,但是如果 key 是以 @ 开头,valueForKey:
就成了一个大坑,建议在 NSDictionary 下只用 objectForKey:
来取值。
给 [dict setValue:nilforKey:@"b"];相当于从字典中删除这个key!
在dict中对于objectForKey:
和 valueForKey:中key不是@开头的且不存在这个key则都返回nil
{ //不存在key@"1"
NSLog(@"%@",[dictionary objectForKey:@"1"]);
NSLog(@"%@",[dictionary valueForKey:@"1"]);
//不存在key@"1"
NSLog(@"%@",[dictionary objectForKey:@"@1"]);
// NSLog(@"%@",[dictionary valueForKey:@"@1"]);//crash
//key无所谓存在
// [dictionary setObject:nil forKey:@"1"];//crash
[dictionary setValue:nil forKey:@"1"];
}
感谢:http://fann.im/blog/2012/04/12/difference-between-objectforkey-and-valueforkey-in-nsdictionary/
ps:另见:《Objective-c 基础教程》P222键/值编码
相关推荐
在iOS开发中,NSDictionary是Objective-C中的一个核心数据结构,它是Foundation框架的一部分,用于存储键值对(key-value pairs)的数据集合。这个压缩包“NSDictionary.zip”可能包含了一个示例项目或者教学资源,...
`NSDictionary`提供了丰富的API用于键值查询,如`objectForKey:`方法可以返回指定键对应的值,如果键不存在则返回`nil`。此外,`containsObjectForKey:`可用于检查字典是否包含特定的键。对于字典的遍历,`allKeys`...
在iOS和Objective-C(OC)开发中,NSArray、NSSet和NSDictionary是Foundation框架中的核心数据结构,它们用于存储和管理对象。这些容器类提供了多种方法来操作和访问存储的数据,是编写应用程序时不可或缺的部分。 ...
在Objective-C中,NSNumber和NSDictionary是两个非常重要的基础类,它们在编程中扮演着不可或缺的角色。即使随着Swift的兴起,Objective-C仍然是许多现有项目和开发者的主要工具,因此了解这两个类的用法至关重要。 ...
基于 NSDictionary 的内存缓存,可以识别未保留的值。 特征 线程安全。 检测未使用的对象并删除它们。 在进入背景时删除未使用的对象。 在收到内存警告时删除所有对象。 用法 设置对象 [cache setObject: object...
NSDictionary-Accessors 为NSDictionary键入安全访问器,最好与从JSON解析的字典一起使用。 前: id value = nil;value = [dictionary objectForKey:@"id"];if ([value isKindOfClass:[NSNumber class]]) { model....
在Objective-C(OC)编程中,`NSDictionary`是核心数据结构之一,用于存储键值对。这个类提供了在集合中存储不可变对象的方法,并且基于键来访问这些对象。在这个“oc中字典的主要内容”课程中,我们将深入探讨`...
NSDictionary * smallDic = [contentDic objectForKey:keyArr[i]]; //获取小字典中得内容 NSString * controllerNameStr = [smallDic objectForKey:@"controllerName"]; //将字符串转化为类名 Class ...
id value = [dict objectForKey:@"key"]; ``` 字典对象通常是无序的,它们存储的是对象的引用,而非实际对象。此外,NSDictionary中的数据成员可以是任意的Objective-C对象,但实际应用中通常是属性列表对象,如...
NSDictionary *data1 = [json1 objectFromJSONString]; NSLog(@"json1.a:%@",[data1 objectForKey"a"]); NSLog(@"json1.b:%@",[data1 objectForKey"b"]); [json1 release]; // 如果json有嵌套,即value里有...
id object = [dict valueForKey:key]; } BOOL keyExists = [dict objectForKey:key] != nil; ``` 以上代码展示了如何初始化字典、访问字典中的值、遍历字典中的键值对以及检查键的存在性。 通过以上的介绍,我们...
return [[NSUserDefaults standardUserDefaults] objectForKey:key]; } ``` - 如果需要更复杂的持久化逻辑,可以考虑使用数据库如SQLite或Core Data。 5. **XML与iOS应用的结合** - 在iOS应用中,libxml常用于...
NSDictionary *sourceDict = [powerSourceInfo objectForKey:key]; if ([[sourceDict objectForKey:@"Type"] isEqualToString:@"Battery"]) { NSNumber *isCharging = [sourceDict objectForKey:@"IsCharging"]...
在iOS开发中,Objective-C是主要的编程语言之一,它提供了丰富的数据结构,如NSArray和NSDictionary,用于存储和处理数据。然而,Objective-C中的这些集合类对null对象(nil)的处理并不友好,直接向数组或字典中...
[self getData:nil completion:^(NSDictionary *dict) { self.codeView.code = [dict objectForKey:@"code"]; }]; }]; [self.codeView didChangeVerificationCode:^(NSString *code) { NSLog(@"self.codeView ...
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissViewControllerAnimated:YES completion:^{}]; UIImage *image = ...
NSDictionary *savedItems = [[NSUserDefaults standardUserDefaults] objectForKey:@"sortedItems"]; NSArray *restoredItems = savedItems[@"items"] ? [NSArray arrayWithArray:savedItems[@"items"]] : items; ...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 设置键盘显示和隐藏的通知 [[NSNotificationCenter defaultCenter] addObserver:self ...
id value = [self objectForKey:key]; if ([value isEqual:NSNull.null]) { [mutableCopy removeObjectForKey:key]; } } return [mutableCopy copy]; } ``` 2. **使用JSON序列化API**: iOS提供了内置的...