当前位置:  开发笔记 > 前端 > 正文

objectForKey和valueForKey之间的区别?

如何解决《objectForKey和valueForKey之间的区别?》经验,为你挑选了4个好方法。

objectForKey和之间有什么区别valueForKey?我在文档中查看了它们,它们对我来说似乎是一样的.



1> Corey Floyd..:

objectForKey:是一种NSDictionary方法.An NSDictionary是一个类似于a的集合类NSArray,除了使用索引之外,它使用键来区分项.键是您提供的任意字符串.没有两个对象可以具有相同的键(就像一个中没有两个对象NSArray可以具有相同的索引).

valueForKey:是一种KVC方法.它适用于任何类.valueForKey:允许您使用字符串作为其名称来访问属性.例如,如果我有Account一个属性的类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:接受任何对象作为键,而不仅仅是字符串.唯一的要求是密钥支持NSCopying协议.
valueForKey对NSDictionary对象的行为有所不同,具体取决于键是否以@符号开头.
警告:valueForKey可能非常慢 - 它目前是我的iPad应用程序中的一个主要瓶颈,因此用"标准"字典替换它会非常慢,这使得应用程序明显变得更快.iOS上的KVC出现了一些问题,我再也不会使用它了 - 不值得降低性能,不得不重新编写它.这是在CALayers上使用带有NSString值的NSString键.仪器显示"CAObject_valueForKey"占总运行时间的25%(!)
我很惊讶没有人通过指出valueForKey来纠正这个答案:技术上不会让你访问相应的实例变量,而是访问器方法(可以)管理实例变量.
@Adam这听起来很吓人.自从iOS7以来你再试过一次吗?如果是这样,事情发生了变化吗?

2> dreamlax..:

当你这样做时,valueForKey:你需要给它一个NSString,而objectForKey:可以将任何NSObject子类作为键.这是因为对于键值编码,键始终是字符串.

事实上,文档声明即使你给valueForKey:NSString,它仍会调用objectForKey:,除非字符串以a开头@,在这种情况下它会调用[super valueForKey:],这可能调用valueForUndefinedKey:可能引发异常.


@عليامين:[就在这里](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html#//apple_ref/doc/uid/20000140 -BBCIBCDJ)

3> Nick Locking..:

这是一个很好的理由在objectForKey:任何可能的地方使用而不是valueForKey:- valueForKey:用一个未知的密钥将抛出NSUnknownKeyException"这个类不是密钥的密钥值编码兼容".


很高兴知道"valueForKey:使用未知密钥将抛出NSUnknownKeyException说"此类不是密钥值编码兼容的密钥"

4> Harjot Singh..:

至于说,该objectForKey:数据类型是:(id)aKeyvalueForKey:数据类型是:(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将由同一种对象访问.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有