OC-KVC

KVC的全称是Key-Value Coding,俗称“键值编码”,可以通过一个key来访问某个属性

使用

常用API

1
2
3
4
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (id)valueForKey:(NSString *)key;

keyPath比key增加了路径访问;例:person.age

原理

setValue:forKey:原理

graph LR
    id1[setValue:forKey:]
    id2{按照
setKey: _setKey:
顺序查找方法} id3[传递参数'调用方法] id4{查看
accessInstanceVariablesDirectly
类方法的返回值} id5{按照
_key _isKey key isKey
查找} id6[直接赋值] id7[调用:
setValue:forUndefinedKey:
并抛出异常NSUnknownKeyException] id1 --> id2 id2 --找到了方法--> id3 id2 --没找到方法--> id4 id4 --YES--> id5 id5 --找到了成员变量--> id6 id5 --没找到成员变量--> id7 id4 --NO--> id7

accessInstanceVariablesDirectly方法的默认返回值是YES

valueForKey:的原理

graph LR
    id1[valueForKey:]
    id2{按照
getKey key isKey _key
顺序查找方法} id3[调用方法] id4{查看
accessInstanceVariablesDirectly
类方法的返回值} id5{按照
_key _isKey key isKey
查找} id6[直接取值] id7[调用:
valueForUndefinedKey:
并抛出异常NSUnknownKeyException] id1 --> id2 id2 --找到了方法--> id3 id2 --没找到方法--> id4 id4 --YES--> id5 id5 --找到了成员变量--> id6 id5 --没找到成员变量--> id7 id4 --NO--> id7