前言
明天咱们简略聊一下 KVC,键值编码。
平时咱们给属性赋值或者取值都是应用点语法,调用属性的 set 或者 get 办法,除此之外苹果还为咱们提供另一种办法,应用 key 或者能够 keyPath 赋值或者取值。
// 赋值
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
-
// 取值
- (nullable id)valueForKey:(NSString *)key;
- (nullable id)valueForKeyPath:(NSString *)keyPath;
具体应用咱就不提了,说说 KVC 底层具体的实现逻辑吧
赋值
当咱们调用了 setValue:forKey:
的时候,比方咱们执行上面代码
[person1 setValue:@10 forkey:@"age"];
零碎会依照 setAge:
,_setAge:
的程序,查找 person 类中是否实现了这些办法(其中之一即可),如果找到了,则间接调用办法,如果这两个办法否没有找到,上面就从 Person 类中查找 + (BOOL)accessInstanceVariablesDirectly
这个办法的返回值。
默认该办法返回的是 YES,通过返回值管制是否容许间接给成员变量赋值。因为有些时候咱们只是创立了一个成员变量,向上面代码中这样,并没有 set 办法,所以就要看是否容许间接给成员变量设置值。
@interface Person : NSObject
{
@public
int _age;
}
@end
如果不容许间接给成员变量赋值,则间接抛出 NSUnknownKeyException 谬误。
如果是容许给成员变量间接设置值,则会依照_age, _isAge, age, isAge 顺便,顺次查找成员变量,查找到成员变量,间接赋值,如果找不到这几个成员变量,抛出 NSUnknownKeyException 谬误。
这就是赋值的整个流程,蛮简略的,可能就是这几个程序容易混掉。
取值
取值的流程跟赋值其实是一样的,只是最开始查找的取值办法是不一样的,大家能够对照下图看一下