微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Key-Value Coding 详解.

Cocoa里面有个概念叫做”Key-Value Coding”,此前一直都没有搞清楚到底什么意思,今天详细的读了一下资料之后算是彻底明白了,下面就分享一下我的理解. 因为我也是刚刚开始学习Cocoa,如果发现任何错误,请马上告诉我. 先谢过 :) .

Cocoa所使用的主要编程语言Objective-C也是单根继承语言(类似的语言还有Java,C#等等),也就是说所有的类都继承自NSObject. 而NSObject定义了两个非常有用的方法一个读取变量值,一个通过名称来设置变量值:

1
2
- (id)valueForKey:(Nsstring *)attrName;
- (void)setValue:(id)newValue forKey:(Nsstring *)attrName;

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
#import <foundation/Foundation.h>
@interface Person : NSObject {
Nsstring *personName;
float expectedRaise;
}
- (float)expectedRaise;
- (void)setExpectedRaise:(float)x;
- (Nsstring *)personName;
- (void)setPersonName:(Nsstring *)aName;
@end

然后来看如下代码:

1
Nsstring *theName = [aPerson valueForKey:@"personName"];

它将通过调用 personName 这个方法来得到返回值.

setValue:forKey: 方法允许你通过名称设置变量的值. 同样,如果存在一个方法(setXXX:)专门设置这个变量,那么就调用这个方法. 如果没有,就直接赋值.

1
[aPerson setValue:@"Grant Balfour" forKey:@"personName"];

它会调用 setPersonName: 来实现赋值.

这套机制就是所谓的”Key-Value Coding”. 它的存在让Cocoa的其他类能够获取和设置你的类变量.
给我的感觉,这个很像 Java 里面的 JavaBean,都是通过一套特殊的命名规范来实现类似C#里面”属性”的机制. 那么,这种机制有什么用呢?
一个出现在我脑子里的用处就是可以很容易的操作一个类里面的数据,当然,前提是这个类在实现的时候确实使用了这套规范. 可是这种机制都存在一个共同的问题,非强制性. 也就是说,在编码的时候是否使用这套命名规范,完全是程序员说了算. 个人的感觉还是C#的实现好一点,如果要实现属性,就必须使用”get.. set..”语法.
第二个用处就是苹果特有的了,遵守这套规范就能很容易的让你的程序和AppleScript集成.
第三个用途则是让Cocoa的可以实现数据绑定.

所以,如果你是个Cocoa程序员,那么请养成在任何时候都遵守这套规范的习惯.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐