第九块石头

Key-Value编程笔记——基础

| Comments

Key-Value Coding是一种非直接访问对象属性的机制,使用字符串来定位属性,而不是直接调用属性的getter或者setter等访问器。

如果属性是简单类型,例如scalar, String或者Boolean,将会转换为NSNumber处理。如obj的a属性是Boolean:

1
2
[obj valueForKey:@"a"] // 获得@YES
[obj setValue:@YES forKey:@"a"] // 传递NSNumber,而不是YES

Key必须遵循OC命名规范:ASCII编码,以小写字母开头,不含空格。

keyPath是将key组合后的一种方便用法,用点分割属性名:

1
2
3
4
5
6
7
[obj valueForKeyPath:@"a.b"]
// 等效于
[[obj valueForKey:@"a"] valueForKey:@"b"]

[obj setValue:@"xx" forKeyPath:@"a.b"]
// 等效于
[[obj valueForKey:@"a"] setValue:@"xx" forKey:@"b"]

valueForKey:找不到给定的Key,会调用valueForUndefinedKey:,默认该方法会抛出 NSUndefinedKeyException,可以重载valueForUndefinedKey:这个方法来进行自己的逻辑。

valueForKeyPath:本质上调用每个返回值的valueForKey:,所以当某层找不到也会调用valueForUndefinedKey:

setValue:forKey:找不到给定的Key,会调用setValue:forUndefinedKey:,和ValueForUndefiedKey:一样,默认抛出NSUndefinedKeyException

setValuesForKeysWithDictionary:是一种批量setValue:forKey:,如果Value是nil,需要用NSNull代替,系统会自动转换。

如果将一个简单类型设置为nil,例如将Boolean类型设置为nil,调用setNilValueForKey:,该方法抛出NSInvalidArgumentException,可以重载setNilValueForKey:,来将nil转换为合适的值。

参考文档:Apple Key-Value Coding Programming Guide

Comments