简单说一下
键值编码必须的方法在非正式协议 NSKeyValueCoding
中声明 <Foundation/NSKeyValueCoding.h>
默认在 NSObject
中实现。
这样我们可以不用通过访问器去访问和设置属性。
我们可以通过属性的字符串名称
去 访问 和 设置 它。
两个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
返回表示属性的键字符串相应的值,如果没有将会调用 valueForUndefinedKey: 的方法。 @ param key 属性的键字符串 */ - (id) valueForKey:(NSString *) key
设置键字符串对应的值为value,如果不能将会调用方法 setValue:ForUndefinedKey:
@param value 要设置的值 @param key 属性的键字符串 */ - (id) setValue: (id)value forKey: (NSString *) key
|
简单的实验证明
代码例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #import <Foundation/Foundation.h>
@interface Person: NSObject // Use ARC { NSString *name; // Person 的 name 属性 NSString *email; // Person 的 email 属性 int age; } - (void)setName:(NSString *)aName; - (NSString *)email; @end
@implementation Person
- (void)setName:(NSString *)aName { NSLog(@"Access: setName:"); name = aName; }
- (NSString *)email { NSLog(@"Access: email:"); return email; }
@end
int main(void) {
static NSString *keys[] = {@"name", @"email", @"age", nil}; @autoreleasepool { id obj = [[Person alloc] init];
/* setValue:forKey: */ [obj setValue:@"Taro" forKey:@"name"]; [obj setValue:@"tar@ryugu-jo" forKey:@"email"]; [obj setValue:[NSNumber numberWithInt:16] forKey:@"age"];
/* valueForKey: */ for (int i=0; keys[i]; i++) NSLog(@"%@: %@", keys[i], [obj valueForKey:keys[i]]); }
return 0; }
|
编译文件
1 2 3
| $ clang kvcsimple.m -framework Foundation $ ls a.out kvcsimple.m
|
结果显示
1 2 3 4 5 6
| $ ./a.out 2016-03-13 10:05:36.105 a.out[656:17248] Access: setName: 2016-03-13 10:05:36.106 a.out[656:17248] name: Taro 2016-03-13 10:05:36.106 a.out[656:17248] Access: email: 2016-03-13 10:05:36.106 a.out[656:17248] email: tar@ryugu-jo 2016-03-13 10:05:36.107 a.out[656:17248] age: 16
|