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:
    方法还是NSDictionary
    objectForKey:
    查找方法,都会指示我是读取对象实例的属性,还是向对象实例发送一条消息,要求它执行其唯一的任务

  • 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显示差异不好吗