iOS kvc
2020-06-19 本文已影响0人
楼上那只猫
什么是kvc?
Key-value coding is a mechanism enabled by the NSKeyValueCoding informal protocol that objects adopt to provide indirect access to their properties. When an object is key-value coding compliant, its properties are addressable via string parameters through a concise, uniform messaging interface. This indirect access mechanism supplements the direct access afforded by instance variables and their associated accessor methods.
kvc提供了一种可以间接访问对象属性的机制。凡是遵守了NSKeyValueCoding
协议的类,都可以使用以下方式去间接读取和设置对象的属性值。
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (nullable id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key;
调用该方法时,设置值的寻找模式如下:
- 首先去找set<Key>或者_set<Key>方法,找到则给对应属性赋值。
- 如果没有找到,并且类方法
accessInstanceVariablesDirectly
returns YES,
那么会去找实例变量 _<key>, _is<Key>, <key>, or is<Key>,找到后给实例变量赋值。 - 如果都没找到,那么会触发
setValue:forUndefinedKey:
,默认抛出异常,子类可重写。
如果key是一个非对象类型,但是value被设置为nil,则会触发下面的方法。
- (void)setNilValueForKey:(NSString *)key
默认抛出异常,可重写。
如果对一个没有的key,调用上面的方法,会触发下面的方法。
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
,默认抛出异常,可重写。
- (nullable id)valueForKey:(NSString *)key
调用该方法时,取值顺序:
- 首先找对应的get<Key>,<key>,is<Key>,或者_<key>。
- 如果沒找到,那么会从
NSArray
或者NSSet
的相关集合类方法中去寻找。 - 如果没找到,并且
accessInstanceVariablesDirectly
返回yes,那么会从实例变量中去寻找。顺序为 _<key>, _is<Key>, <key>, or is<Key>。 - 如果找到的是对象类型,直接返回,如果是基本数据类型,并且可以用
NSNumber
包装,那么用该类包装后返回。如果不能被NSNumber
包装,那么用NSValue
包装后返回。 - 如果上述步骤都失败,那么调用
valueForUndefinedKey:
方法,子类可重写。