首先,KVC是键值对编码,是NSObject的非常正式协议。
@property(class,readonly)BOOL accessInstanceVariablesDirectly
这个方法默认是YES,如果在自己的类中重写了,修改了返回值为NO,如果不存在这个值,就不会继续执行查找规制。
- (nullable id)valueForKey:(NSString*)key
这个要看第一个方法accessInstanceVariablesDirectly的值,如果是YES,就要继续执行查找链了。
先按这个顺序进行查找-get
如果getter值没有找到,进行-countOf
如果上面方法还是没有找到,进行-countOf
如果上面方法还是没有找到,进行_
如果上面方法还是没有收到,就要跳转到valueForUndefinedKey这个方法。
下面讲解- (void)setValue:(nullableid)value forKey:(NSString*)key这个方法
在设置值的时候,首先查找-set
如果没有上面的方法,要进行_is
如果上面方法成功,就要setValue:forUndefinedKey:这个方法,如果不调用,程序会崩溃的。
- (BOOL)validateValue:(inoutid_Nullable*_Nonnull)ioValue forKey:(NSString*)inKey error:(outNSError**)outError
这个方法如果不重写,就一直返回YES。如果重写了这个方法,就要在这个方法中进行key-value值判断。
- (NSMutableArray*)mutableArrayValueForKey:(NSString*)key
这个方法,如果能响应,就能调用-insertObject:inAtIndex: and -removeObjectFromAtIndex:这两个方法,实质就是操作的是NSMutableArray数组类插入和删除方法。
如果不能响应,就要-set
如果上面还是不能响应,就要看accessInstanceVariablesDirectly是否返回YES,如果返回NO,结束查找。如果返回YES,继续查找_
如果上面不能响应,就要valueForUndefinedKey这个方法。
- (NSMutableSet*)mutableSetValueForKey:(NSString*)key
这个方法,如果能响应返回是NSMutableSet,就能调用这两个-add
如果不能响应,就要-set:方法,如果能响应,就发送给NSMutableSet,然后在调用-set:方法赋值。
如果上面还是不能响应,就要看accessInstanceVariablesDirectly是否返回YES,如果返回NO,结束查找。如果返回YES,继续查找_
如果上面不能响应,就要valueForUndefinedKey这个方法。
- (void)setNilValueForKey:(NSString*)key
如果是设置简单变量的时候,就要在这个方法中进行重新设置。
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues
这个方法就是先要定义一个字典变量和类中成员变量一一对应的。如果在字典中设置变量找不到类中的成员变量,就会调用- (void)setValue:(nullableid)value forUndefinedKey:(NSString*)key这个方法。
kvc应用在UITextField等一些控件属性修改。例如修改UITextField的placeholder文本颜色和字体大小。将字典与model相互转换。