我已经阅读了注释的文档,但是,我仍然不明白,KVC 和属性访问(property accessor)方法有什么区别?他们不一样吗?如何区分调用 setValue:forKeyPath 的点和简单访问器(simple accessors)?
但是,我仍然不明白,KVC 和属性访问(property accessor)方法有什么区别?
KVC 是调用属性访问器方法或以其他方式访问属性的一种方法。
“以其他方式访问”是什么意思?
对于 KVC 而言,没有访问器方法的实例变量会被视为非正式属性。
如果没有找到匹配的访问器对,它将直接获取或设置实例变量的值。
(是的,在现代代码中这是不值得使用的,总是为任何你想访问的任何东西声明一个 @property
,反之,不要使用 KVC 来访问任何不属于公共属性的东西。)
属性访问器方法是 KVC 在其存在的情况下会调用的方法(KVC 和每个理智的程序员都倾向于直接 ivar 访问)。访问者可以获取或设置实例变量,如合成访问者所做的那样,或者访问某些其他存储。
访问器是实现,属性是接口,KVC 是使用它们的一种方式。
如何区分调用 “setValue:forKeyPath” 的点和简单访问器?
键路径是一个字符串,而属性访问表达式是一个表达式。编译器检测属性访问表达式并将其转换为一个或多个 Objective-C 消息,而键路径由 KVC 在运行时检测。
所以,当你使用键路径时:
[someObject setValue:theValue forKeyPath:@"foo.bar.baz"];
你知道这是一个键路径,因为
- 它是一个字符串,如本例中的字符串文字语法
@“...”
所示; - 将密钥路径字符串传递给
setValue:forKeyPath:
检测。
使用键路径是使用 KVC 来访问指定的属性。它会代表你发送任何相关的访问者消息。
当您使用属性访问表达式时:
someObject.foo.bar.baz = theValue;
你知道这是一个属性访问表达式,因为你没有用字符串标识属性。你正在使用自己的代码访问它们(发送访问者消息)。
没有太多理由以任何形式使用 KVC;当你在作者/编译时知道该属性时,最好声明 @property
并自己访问属性,无论是使用属性访问表达式还是消息表达式([[[someObject foo] bar] setBaz:theValue]
)。使用 KVC 的时间是在运行时间之前不知道要访问的属性,这很少见。它主要是 KVO,Cocoa Bindings,Core Animation 等部分背后的构建块技术。
大多数情况下,你只需要自己访问属性。
网友评论