基本概念
- KVC 是 Key-Value Coding 的缩写,让开发者可以通过 Key 直接访问或设置对象的属性/成员变量,而不需要调用存取方法
- KVC 可以直接获取、修改类不想暴露的私有变量,所以会破坏面向对象的编程思想
- UITextView 设置
_placeholderLabel可用到
基础用法
1 | - (id)valueForKey:(NSString *)key; // 直接通过 Key 来取值 |
通过 Key 来访问直接的属性
1 | // age 是 b 的属性 |
通过 KeyPath 来访问属性的属性
1 | // b 是 a 的一个属性 |
实现原理
KVC setter 的查找过程
以 [b setValue:@23 forKey:@"age"]; 举例
- 查找 B 中的
setAge:、_setAge:方法;找到则调用,结束 - 查看 B 的
+ (BOOL)accessInstanceVariablesDirectly返回值,若为 NO 则调用 B 的setValue:forUndefinedKey:并抛异常,结束(默认值为 YES) - 查找 B 中的
_age、_isAge、age、isAge,找到则直接访问;否则调用 B 的setValue:forUndefinedKey:并抛异常
KVC getter 的查找过程
以 [b valueForKey:@"age"]; 举例
- 查找 B 中的
getAge、age、isAge、_getAge、_age、_isAge方法;找到则调用,结束 - 查找一些集合类的特有方法,比如 count/sum/average 等,这里不展开
- 查看 B 的
+ (BOOL)accessInstanceVariablesDirectly返回值,若为 NO 则调用 B 的valueForUndefinedKey:并抛异常,结束(默认值为 YES) - 查找 B 中的
_age、_isAge、age、isAge,找到则直接访问;否则调用 B 的valueForUndefinedKey:并抛异常
accessInstanceVariablesDirectly 方法,顾名思义,是否允许直接访问成员变量,默认 YES