Cocoa所使用的主要编程语言Objective-C也是单根继承语言(类似的语言还有Java, C#等等), 也就是说所有的类都继承自NSObject. 而NSObject定义了两个非常有用的方法 – 一个读取变量值, 一个通过名称来设置变量值:
1 2 | |
valueForKey: 这个方法允许你通过变量名读取变量的值. 当然, 很可能已经存在一个方法专门用来读取这个变量. 这个方法是这样执行的: 如果存在一个访问方法, 那么就是用这个方法去读取变量值. 如果没有, 那么就直接去读取给定名称的变量.
假设把字符串 @”foo” 传给 valueForKey:.
如果object拥有一个方法 foo, 那么 valueForKey 就会执行这个方法然后返回 foo 的返回值. 如果没有, valueForKey 就开始在object的类变量里面寻找是否有 foo 这个变量. 如果找到了, 那么就返回 foo 的值.
如果object里面既没有 foo 这个方法, 也没有 foo 这个类变量, 那么一个异常就抛出来了.
下面我们定义个类 Person:
1 2 3 4 5 6 7 8 9 10 | |
然后来看如下代码:
1 | |
它将通过调用 personName 这个方法来得到返回值.
setValue:forKey: 方法允许你通过名称设置变量的值. 同样, 如果存在一个方法(setXXX:)专门设置这个变量, 那么就调用这个方法. 如果没有, 就直接赋值.
1 | |
它会调用 setPersonName: 来实现赋值.
这套机制就是所谓的”Key-Value Coding”. 它的存在让Cocoa的其他类能够获取和设置你的类变量.
给我的感觉, 这个很像 Java 里面的 JavaBean, 都是通过一套特殊的命名规范来实现类似C#里面”属性”的机制. 那么, 这种机制有什么用呢?
第一个出现在我脑子里的用处就是可以很容易的操作一个类里面的数据, 当然, 前提是这个类在实现的时候确实使用了这套规范. 可是这种机制都存在一个共同的问题, 非强制性. 也就是说, 在编码的时候是否使用这套命名规范, 完全是程序员说了算. 个人的感觉还是C#的实现好一点, 如果要实现属性, 就必须使用”get.. set..”语法.
第二个用处就是苹果特有的了, 遵守这套规范就能很容易的让你的程序和AppleScript集成.
第三个用途则是让Cocoa的可以实现数据绑定.
所以, 如果你是个Cocoa程序员, 那么请养成在任何时候都遵守这套规范的习惯.