KVC和Properties有什么区别?

Ver*_*ous 8 cocoa objective-c key-value-coding

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

Objective-C 2.0的点语法和键值编码是正交技术.无论是否使用点语法,都可以使用键值编码,无论是否使用KVC,都可以使用点语法.但是,两者都使用"点语法".在键值编码的情况下,语法用于分隔键路径中的元素.重要的是要记住,当您使用点语法访问属性时,您将调用接收器的标准访问器方法.

然后它提供了一个例子,据说显示了两者之间的差异.但是,我仍然没有得到,KVC和属性访问器方法有什么区别?他们不一样吗?我如何区分调用setValue:forKeyPath:和简单访问器的点?

Pet*_*sey 15

但是,我仍然没有得到,KVC和属性访问器方法有什么区别?

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

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

属性访问器方法是KVC在它们存在时将调用的方法(首选,由KVC和每个理智的程序员,通过直接的ivar访问).访问器可以获取或设置实例变量,如合成访问器那样,或访问某些其他存储器.

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

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

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

因此,当您使用密钥路径时:

[someObject setValue:theValue forKeyPath:@"foo.bar.baz"];
Run Code Online (Sandbox Code Playgroud)

你知道它是一个关键路径,因为(1)它是一个字符串,在这种情况下由字符串文字语法表示@"…",(2)你传递了键路径字符串,setValue:forKeyPath:以便进行评估.

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

使用属性访问表达式时:

someObject.foo.bar.baz = theValue;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • **"使用KVC的时间是指在运行时间之前您不知道要访问的属性"**您的答案是我正在寻找的,谢谢. (4认同)