在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.
此作为补充加深理解