Objective c valueforKey:、objectForKey:、valueForKeyPath之间有什么区别?
我有两个问题:Objective c valueforKey:、objectForKey:、valueForKeyPath之间有什么区别?,objective-c,Objective C,我有两个问题: valueForKey:和objectForKey:之间有什么区别?是一个用于NSDictionarys(objectForKey:),而另一个用于valueforKey:,还是相反 还有valueForKey:和valueForKeyPath:之间的区别是什么?它是否与核心数据有关 请帮忙 valueForKey:和valueAtKeyPath:是在NSKeyValueCoding非正式协议中定义的方法,这两种方法的默认实现都由根类NSObject提供 objectForKey
valueForKey:
和objectForKey:
之间有什么区别?是一个用于NSDictionary
s(objectForKey:
),而另一个用于valueforKey:
,还是相反valueForKey:
和valueForKeyPath:
之间的区别是什么?它是否与核心数据有关valueForKey:
和valueAtKeyPath:
是在NSKeyValueCoding
非正式协议中定义的方法,这两种方法的默认实现都由根类NSObject
提供
objectForKey:
是NSDictionary
上的一个方法valueForKey:
接受属性的键,而valueAtKeyPath:
接受所谓的键路径。键路径是一个特定属性的周期删除路径,如@“relationship.property”
valueForKey:
是NSKeyValueCoding协议的一部分,因此是键值编码框架的一部分,它允许您在运行时按名称访问类属性。这就是NIB的加载方式,例如,加载与连接关联的属性的名称,然后直接按名称设置值。这与可视化界面设计工具通常在其他语言中工作的方式形成对比,生成大量隐藏的静态编译代码
objectForKey:
仅在字典上定义,并通过其键查找对象。NSDictionary是存储值和键之间的连接的类
因此,可以在NSDictionary上使用valueForKey:
来返回有关字典的元信息,例如字典中对象的计数、所有键的列表等。objectForKey:
实际上将用于查看字典
在运行时,区别在于objectForKey:
是一个具有完全不透明实现的方法valueForKey:
明确依赖于随后调用命名的getter和setter。后者的原因是,您可以将键值编码扩展到键值观察,在这种情况下,当特定对象上的特定属性每次更改时,您都会要求得到通知。在运行时,这是通过swizzle方法实现的,其中原始setter被一个新的setter替换,该setter调用以前的setter,然后发送所需的消息。因为所有消息都是动态调度的,所以这只是通过修改对象实例中的表来实现的
因此,任何符合键值编码的对象(这只意味着以正确的方式声明和实现属性,新的ish@property/@synthesis语法会自动执行这些操作)都可以被观察到,而无需对象本身实现任何代码
还有更多的苹果产品使用键值编码来实现各种功能,包括CoreData,但它并不是专门用于实现任何其他技术
valueForKeyPath:
与valueForKey:
类似,只是它可以遍历多个对象。因此,您可以拥有一个具有一组属性的根对象,每个属性都是另一个具有另一组属性的对象,等等,并且使用键路径,您可以从该数据结构的叶中检索出一个值,而无需自己在一个对象之后迭代
总之,valueForKey:
和valueForKeyPath:
提供了有关对象实例的信息,并与Objective-C运行时的动态特性交互objectForKey:
是一种特定于字典的方法,用于执行字典任务
补充:
例如,按照I类型编码并假设NSDictionary符合键值编码:
NSDictionary *someDictionary;
// create someDictionary, populate it, for example (note: we assume photoOfKeys.jpg
// definitely exists, not a good idea for production code — if it doesn't we'll get
// a nil there and anything after it won't be added to the dictionary as it'll appear
// that we terminated the list):
someDictionary = @{ @"favouriteGarment": @"hat",
@"@allKeys" : [NSImage imageNamed:NSImageNameDotMac],
@(2) : NSArray.new };
NSObject *allKeys;
// we make no assumptions about which type @allKeys will be, but are going to assume
// we can NSLog it, so it needs to be a descendant of NSObject rather than 'id' so as
// to definitely respond to the 'description' message — actually this is just compile
// time semantics, but if someone else reads this code it'll make it obvious to them
// what we were thinking...
// some code to get all of the keys stored in the dictionary and print them out;
// should print an array containing the strings 'favouriteGarment', '@allKeys' and
// the number 2
allKeys = [someDictionary valueForKey:@"@allKeys"];
NSLog(@"%@", allKeys);
// some code to get the object named '@allKeys' from the dictionary; will print
// a description of the image created by loading photoOfKeys.jpg, above
allKeys = [someDictionary objectForKey:@"@allKeys"];
NSLog(@"%@", allKeys);
// `objectForKey is analogous to `objectForKeyedSubscript:`, aka
allKeys = someDictionary[@"@allKeys"];
allKeys
是NSDictionary的一个属性,如上所述。我还添加了从NSString allKeys到一些键的照片的映射。无论我是使用键值编码valueForKey:
方法还是NSDictionaryobjectForKey:
查找方法,都会指示我是读取对象实例的属性,还是向对象实例发送一条消息,要求它执行其唯一的任务
objectForKey:
是NSDictionary
上用于访问与键关联的对象的方法valueForKey:
是NSObject
上的一种方法,用于通过访问器方法、属性和/或实例变量的名称访问与任何对象关联的任何值valueForKeyPath:
可以看作是对valueForKey:
的多次调用的简写。如果愿意的话,可以将其视为某种xpath// Using nested valueForKey:
NSLog(@"%@", [[myObject valueForKey:@"foo"] valueForKey:@"bar"]);
// Can be done with a single valueForKeyPath;
NSLog(@"%@", [myObject valueForKeyPath:@"foo.bar"]);
valueForKey:
和valueForKeyPath:
是KVC(键值编码)的一部分。介绍和深入的文档可以在这里找到:类似的问题我对在字典中使用valueForKey:和objectForKey:有点困惑。当你说valueForKey可以在NSDictionary上用于返回有关该字典的元信息时,例如其中的对象计数、所有键的列表等。请举例说明它将返回什么,这样我就有点清楚了。@hmthur我认为有一些很好的例子@“allKeys”示例中应为@@allKeys。Tommy,您可以为“allKeys”部分使用更好的示例;)但是很好的解释,我会+1。然而,我感到困惑的是,不应该在代码片段[UIImage imageNamed:@“photoOfKeys.jpg]、@“@allKeys”
和allKeys=[someDictionary objectForKey:@“allKeys”]中使用@“allKeys”
be@“allKeys”
,以更好地显示差异?使用sp显示差异不好吗