objective-c - KVC 和属性有什么区别?

标签 objective-c cocoa key-value-coding

所以,我已经阅读了注释的文档

Objective-C 2.0’s dot syntax and key-value coding are orthogonal technologies. You can use key-value coding whether or not you use the dot syntax, and you can use the dot syntax whether or not you use KVC. Both, though, make use of a “dot syntax.” In the case of key-value coding, the syntax is used to delimit elements in a key path. It is important to remember that when you access a property using the dot syntax, you invoke the receiver’s standard accessor methods.

然后它提供了一个示例,据称显示了两者之间的区别。但是,我还是不明白,KVC 和属性访问器方法有什么区别?他们不一样吗?我如何区分调用 setValue:forKeyPath: 的点和简单的访问器?

最佳答案

However, I still don't get, what's the difference between KVC and property accessor methods?

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

“否则访问”是什么意思?出于 KVC 的目的,没有访问器方法的实例变量算作非正式属性。如果找不到匹配的访问器对,它将直接获取或设置实例变量的值。 (是的,这不值得在现代代码中使用。始终为您打算在其他地方访问的任何内容声明一个 @property,相反,不要使用 KVC 访问任何非公共(public)的内容属性(property)。)

属性访问器方法是 KVC 将在它们存在时调用的方法(KVC 和每个理智的程序员都首选,而不是直接访问 ivar)。访问器可以像合成访问器一样获取或设置实例变量,或者访问其他一些存储。

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

And how do I distinguish between dots that call setValue:forKeyPath: and simple accessors?

键路径是一个字符串,而属性访问表达式是一个表达式。编译器计算属性访问表达式并将其翻译成一个或多个 Objective-C 消息,而关键路径由 KVC 在运行时计算。

因此,当您使用关键路径时:

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

您知道这是一个关键路径,因为 (1) 它是一个字符串,在本例中由字符串文字语法 @"..." 指示,并且 (2) 您正在传递 key -setValue:forKeyPath: 的路径字符串,用于评估。

使用键路径是使用 KVC 访问命名属性。它将代表您发送任何相关的访问者消息。

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

someObject.foo.bar.baz = theValue;

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

没有太多理由以任何形式使用 KVC;当您在创作/编译时知道该属性时,最好声明一个 @property 并自己访问该属性,无论是使用属性访问表达式还是消息表达式([[[someObject foo] bar] setBaz:theValue]).使用 KVC 的时候是在运行时才知道要访问什么属性的时候,这种情况很少见。它主要是 KVO、Cocoa Bindings、Core Animation 的一部分等背后的构建 block 技术。

大多数情况下,您只想自己访问属性。

关于objective-c - KVC 和属性有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8191373/

相关文章:

objective-c - 在 Cocoa 中为进程添加观察者

cocoa - 观察 NSMutableArray 的插入/删除

ios - 具有 selectedSegmentIndex 的 cellForRowAtIndexPath 中的 NSRangeException

objective-c - 将 Swift 桥接到 Objective-C 会丢失语法突出显示,导致错误

ios - 捕捉使用 CoreGraphics 绘制的形状内的触摸 - Objective C

cocoa - 将文件从 Finder 拖到 Web View 时获取文件路径?

CoreFoundation 所有权遵循 CreateRule

cocoa 绑定(bind)问题;绑定(bind)表列不显示任何数据,控制台中没有错误

objective-c - Objective-C 协议(protocol)的默认实现

ios - 使用自动布局读取 UI 正确框架