- KVC 全称是 Key-Value Coding, 俗称键值编码,可以通过一个 Key 来访问某个属性
- 常见 API 有:
1、setValue:(nullable id)value forKey:(NSString *)key
2、- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
3、valueForKey:(NSString *)key
4、valueForKeyPath:(NSString *)keyPath
setValue: forKey: 原理
KVC 赋值原理.pngvalueForKey:原理
KVC 取值原理.png-
通过 KVC 修改属性会触发 KVO吗?
会触发 KVO -
通过 KVC 给成员变量赋值会触发 KVO 吗?
会触发 KVO,通过 KVC给成员变量赋值的时候会触发willChangeValueForKey:
、didChangeValueForKey:
方法,从而触发 KVO. -
KVC 的赋值和取值过程是怎样的? 原理是什么?
赋值 :setValue:forKey:
方法内部会一次查找setKey:
、_setKey
方法,如果找到了就传递参数调用方法,如果没找到会查看+(void)accessInstanceVariablesDirectly
方法的返回值,如果返回值为 NO,则调用setValue:forUndefinedKey:
方法并抛出异常,如果返回值为 YES,则依次查找_key
、_isKey
、key
、isKey
成员变量,找到了直接赋值,没找到则调用setValue:forUndefinedKey:
方法并抛出异常
取值:valueForKey:
方法内部会依次查找getKey
、key
、isKey
、_key
方法,如果找到直接调用方法,如果没找到方法会查看+(void)accessInstanceVariablesDirectly
方法的返回值,如果返回值为 NO,则调用valueForUndefinedKey:
方法并抛出异常,如果返回值是 YES,则依次查找_key
、_isKey
、key
、isKey
成员变量,找到了直接取值,没找到则调用valueForUndefinedKey:
方法并抛出异常.
网友评论