简思Key & KeyPath

在KVC中有着这样的两种相似的方法

  • setValue:forKeyPath:
  • setValue:forKey:

这两种方法中的Key和KeyPath总是不理解,到底两者之间有什么区别呢?

在官方文档中对这两个参数有着这样的解释:

  • keyPath: A key path of the form relationship.property (with one or more relationships): for example “department.name” or “department.manager.lastName.”
  • key: The name of one of the receiver's properties.

个人理解,keyPath是一个完整的‘路径’,指向关系链中最末关系节点的属性,举一个不恰当的例子:

  • 文件路径:/Users/choshoryo/Desktop/123.png

这就是一个完整的路径,它的‘关系链’结构就是/文件夹/文件夹/文件夹/文件,最终真正要处理的是最末端文件夹中的123.png文件。同理,keyPath中真正要赋值的也是最末端的property,在找到该属性之前,系统会沿着这条关系链一层一层去寻找。因此,keyPath传入的参数应是一条描述着与接收者有关系的对象的属性的路径。

而相对的,key传入的参数则是接收者自己本身的属性。

针对keyPath为参数的KVC方法,系统是通过valueForKey:方法查找最终要赋值的属性,官方文档中有如此说明:

  • Discussion (- setValue:forKeyPath:)
    The default implementation of this method gets the destination object for each relationship using valueForKey:, and sends the final object a setValue:forKey: message.
    此作为补充加深理解

你可能感兴趣的:(简思Key & KeyPath)