但是,我还是不明白,KVC 和属性访问器方法有什么区别?
KVC 是一种调用属性访问器方法或以其他方式访问属性的方法。
“否则访问”是什么意思?对于 KVC 目的,没有访问器方法的实例变量算作非正式属性。如果找不到匹配的访问器对,它将直接获取或设置实例变量的值。 (是的,这不值得在现代代码中使用。始终为您打算在其他地方访问的任何内容声明 @property,并且相反,不要使用 KVC 访问任何不是公共属性的内容。)
如果存在,KVC 将调用属性访问器方法(KVC 和每个理智的程序员都喜欢直接访问 ivar)。访问器可以像合成访问器一样获取或设置实例变量,也可以访问其他存储。
访问器是实现,属性是接口,KVC是使用它们的一种方式。
我如何区分调用 setValue:forKeyPath: 的点和简单的访问器?
键路径是字符串,而属性访问表达式是表达式。编译器评估属性访问表达式并将其转换为一个或多个 Objective-C 消息,而关键路径由 KVC 在运行时评估。
所以,当你使用关键路径时:
[someObject setValue:theValue forKeyPath:@"foo.bar.baz"];
您知道它是一个键路径,因为 (1) 它是一个字符串,如本例中的字符串文字语法 @"…" 所示,并且 (2) 您将键路径字符串传递给 setValue:forKeyPath:它来评估。
使用密钥路径是使用 KVC 访问命名属性。它将代表您发送任何相关的访问者消息。
当您使用属性访问表达式时:
someObject.foo.bar.baz = theValue;
您知道这是一个属性访问表达式,因为您没有用字符串标识属性。您正在自己的代码中访问它们(发送访问者消息)。
没有太多理由以任何形式使用 KVC;当您在作者身份/编译时知道该属性时,最好声明 @property 并自己访问该属性,无论是使用属性访问表达式还是消息表达式 ([[[someObject foo] bar] setBaz:theValue])。使用 KVC 的时间是在运行时才知道要访问什么属性,这种情况非常罕见。它主要是 KVO、Cocoa Bindings、Core Animation 的部分等背后的构建块技术。
大多数情况下,您只想自己访问属性。