KVC 和 Properties有什么区别?【译】

但是,我仍然不明白,KVC 和属性访问(property accessor)方法有什么区别?


KVC 是调用属性访问器方法或以其他方式访问属性的一种方法。

“以其他方式访问”是什么意思?

对于 KVC 而言,没有访问器方法的实例变量会被视为非正式属性。
如果没有找到匹配的访问器对,它将直接获取或设置实例变量的值。
(是的,在现代代码中这是不值得使用的,总是为任何你想访问的任何东西声明一个 @property,反之,不要使用 KVC 来访问任何不属于公共属性的东西。)

属性访问器方法是 KVC 在其存在的情况下会调用的方法(KVC 和每个理智的程序员都倾向于直接 ivar 访问)。访问者可以获取或设置实例变量,如合成访问者所做的那样,或者访问某些其他存储。

访问器是实现,属性是接口,KVC 是使用它们的一种方式。

如何区分调用 setValue:forKeyPath 的点和简单访问器?


键路径是一个字符串,而属性访问表达式是一个表达式。编译器检测属性访问表达式并将其转换为一个或多个 Objective-C 消息,而键路径由 KVC 在运行时检测。

所以,当你使用键路径时:

1
[someObject setValue:theValue forKeyPath:@"foo.bar.baz"];

你知道这是一个键路径,因为

  1. 它是一个字符串,如本例中的字符串文字语法 @“...” 所示;
  2. 将密钥路径字符串传递给 setValue:forKeyPath: 检测。

使用键路径是使用 KVC 来访问指定的属性。它会代表你发送任何相关的访问者消息。

当您使用属性访问表达式时:

1
someObject.foo.bar.baz = theValue;

你知道这是一个属性访问表达式,因为你没有用字符串标识属性。你正在使用自己的代码访问它们(发送访问者消息)。

没有太多理由以任何形式使用 KVC;当你在作者/编译时知道该属性时,最好声明 @property 并自己访问属性,无论是使用属性访问表达式还是消息表达式([[[someObject foo] bar] setBaz:theValue])。使用 KVC 的时间是在运行时间之前不知道要访问的属性,这很少见。它主要是 KVO,Cocoa Bindings,Core Animation 等部分背后的构建块技术。

大多数情况下,你只需要自己访问属性。

原文链接:What’s the difference between KVC and Properties?