前言

明天咱们简略聊一下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谬误。

这就是赋值的整个流程,蛮简略的,可能就是这几个程序容易混掉。

取值

取值的流程跟赋值其实是一样的,只是最开始查找的取值办法是不一样的,大家能够对照下图看一下