iOS kvc

作者: 楼上那只猫 | 来源:发表于2020-06-19 11:53 被阅读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;

调用该方法时,设置值的寻找模式如下:

  1. 首先去找set<Key>或者_set<Key>方法,找到则给对应属性赋值。
  2. 如果没有找到,并且类方法accessInstanceVariablesDirectly returns YES,
    那么会去找实例变量 _<key>, _is<Key>, <key>, or is<Key>,找到后给实例变量赋值。
  3. 如果都没找到,那么会触发setValue:forUndefinedKey:,默认抛出异常,子类可重写。
    如果key是一个非对象类型,但是value被设置为nil,则会触发下面的方法。
    - (void)setNilValueForKey:(NSString *)key
    默认抛出异常,可重写。
    如果对一个没有的key,调用上面的方法,会触发下面的方法。
    - (void)setValue:(id)value forUndefinedKey:(NSString *)key,默认抛出异常,可重写。

- (nullable id)valueForKey:(NSString *)key

调用该方法时,取值顺序:

  1. 首先找对应的get<Key>,<key>,is<Key>,或者_<key>。
  2. 如果沒找到,那么会从NSArray或者NSSet的相关集合类方法中去寻找。
  3. 如果没找到,并且accessInstanceVariablesDirectly返回yes,那么会从实例变量中去寻找。顺序为 _<key>, _is<Key>, <key>, or is<Key>。
  4. 如果找到的是对象类型,直接返回,如果是基本数据类型,并且可以用NSNumber包装,那么用该类包装后返回。如果不能被NSNumber包装,那么用NSValue包装后返回。
  5. 如果上述步骤都失败,那么调用valueForUndefinedKey:方法,子类可重写。

相关文章

网友评论

      本文标题:iOS kvc

      本文链接:https://www.haomeiwen.com/subject/qeupxktx.html