objectForKey和valueForKey之间的区别是什么? 我在文档中查阅了两者,在我看来它们是一样的。
当前回答
objectForKey是一个NSDictionary方法。NSDictionary是一个类似于NSArray的集合类,除了它不使用索引,而是使用键来区分条目。键是您提供的任意字符串。没有两个对象可以有相同的键(就像NSArray中没有两个对象可以有相同的索引一样)。
valueForKey: KVC方法。它适用于任何类。valueForKey:允许您使用字符串作为属性名访问属性。因此,例如,如果我有一个帐户类的属性accountNumber,我可以做以下工作:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
使用KVC,我可以动态访问属性:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
它们是等价的表述。
我知道你在想:哇,但讽刺的是。KVC看起来没那么有用。事实上,它看起来很“啰嗦”。但是当你想在运行时改变一些东西时,你可以做很多很酷的事情,这些事情在其他语言中要困难得多(但这超出了你的问题范围)。
如果你想了解更多关于KVC的知识,有很多教程,特别是在Scott Stevenson的博客上。你也可以查看NSKeyValueCoding协议参考。
其他回答
objectForKey是一个NSDictionary方法。NSDictionary是一个类似于NSArray的集合类,除了它不使用索引,而是使用键来区分条目。键是您提供的任意字符串。没有两个对象可以有相同的键(就像NSArray中没有两个对象可以有相同的索引一样)。
valueForKey: KVC方法。它适用于任何类。valueForKey:允许您使用字符串作为属性名访问属性。因此,例如,如果我有一个帐户类的属性accountNumber,我可以做以下工作:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
使用KVC,我可以动态访问属性:
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
它们是等价的表述。
我知道你在想:哇,但讽刺的是。KVC看起来没那么有用。事实上,它看起来很“啰嗦”。但是当你想在运行时改变一些东西时,你可以做很多很酷的事情,这些事情在其他语言中要困难得多(但这超出了你的问题范围)。
如果你想了解更多关于KVC的知识,有很多教程,特别是在Scott Stevenson的博客上。你也可以查看NSKeyValueCoding协议参考。
这里有一个很好的理由使用objectForKey:只要可能,而不是valueForKey: - valueForKey:与一个未知的键将抛出NSUnknownKeyException说“这个类不是键值编码兼容的键”。
该表表示objectForKey和valueForKey之间的四个不同点。
objectForKey | valueForKey | |
---|---|---|
Works on ... | NSDictionary | NSDictionary / KVC |
Throws exception | No | Yes (on KVC) |
Feed | NSObject's subclass | NSString |
Usage on KVC | cannot | can |
当你做valueForKey:时,你需要给它一个NSString,而objectForKey:可以接受任何NSObject子类作为键。这是因为对于键值编码,键总是字符串。
事实上,文档声明,即使你给valueForKey:一个NSString,它将调用objectForKey:无论如何,除非字符串以@开头,在这种情况下,它调用[super valueForKey:],这可能会调用valueForUndefinedKey:,这可能会引发异常。
如前所述,objectForKey: datatype是:(id)aKey,而valueForKey: datatype是:(NSString *)key。
例如:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];
NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);
//This will work fine and prints ( 123 )
NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]);
//it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime.
因此,valueForKey:将只接受一个字符串值,是一个KVC方法,而objectForKey:将接受任何类型的对象。
objectForKey中的值将被同类对象访问。
推荐文章
- 在实现API时,我如何避免在块中捕获自我?
- 从另一个应用程序打开设置应用程序
- 使用NSURLSession发送POST请求
- 如何更改导航栏上“后退”按钮的标题
- 有没有办法从UITableView中移除分隔线?
- 如何在Objective-C中声明类级属性?
- 在Objective-C中@property保留,赋值,复制,非原子
- 我如何在NSAttributedString中创建一个可点击的链接?
- 停止UIWebView垂直“弹跳”?
- 对未渲染的视图进行快照,结果是一个空快照
- 开始使用instancetype而不是id是否有益?
- 我可以强制UITableView隐藏分隔符之间的空单元格吗?
- 为什么Objective-C文件使用。m扩展名?
- Objective-C for Windows
- 获得推送通知,而应用程序在前台iOS