KVC/KVO

1.KVC赋值

赋值
  • 查看setKey:方法是否存在, 如果存在直接调用

  • 查看_setKey:方法是否存在, 如果存在直接调用

  • 查看+ (BOOL)accessInstanceVariablesDirectly方法的返回值, 默认返回YES

    • YES: 可以访问成员变量, 进入下一步
    • NO: 不可以访问成员变量, 同时调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法, 如果方法不存在会抛出异常
  • 调用成员变量:_key, _isKey, key, isKey

  • 调用顺序, 从左到右, 只有发现存在成员变量, 就不会在调用后续变量
    如果没有成员变量, 会调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key方法, 如果方法不存在会抛出异常


  • 附加知识: setValuesetObject的区别
NSMutableDictionary特有的方法
key不为nil的所有继承NSCopying的类型
value不可以为nil
- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

KVC的主要方法
key必须是不为nil的字符串类型
value是可以为nil的
- (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;

2.KVC取值

取值
  • 判断是否有这几个方法: getKey, key, isKey, _key 从左到右, 如果有方法直接调用, 取值结束
    • 如果没有,调用+ (BOOL)accessInstanceVariablesDirectly查看是否可以访问成员变量. 默认YES
    • YES: 可以访问成员变量
    • NO: 不可以访问成员变量, 判断是否实现- (id)valueForUndefinedKey:(NSString *)key方法, 实现时调用, 未实现报错
  • 判断是否有这几个成员变量:_key, _isKey, key, isKey从左到右, 如果有成员变量, 直接访问, 取值结束
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。