iOS 底层 day05 KVC
2020-08-26 本文已影响0人
望穿秋水小作坊
KVC(Key-value coding)键值编码,就是指 iOS 的开发中,可以运行开发中通过 Key 名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法。这样就可以再运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是 iOS 开发中的黑魔法之一。很多高级的 iOS 开发技巧都是基于 KVC 实现的。
一、KVC 基本用法
1. setValue:forKey:
和 valueForKey
Person *person = [[Person alloc] init];
[person setValue:@10 forKey:@"age"];
NSLog(@"%@", [person valueForKey:@"age"]);
2. setValue:forKey:
和 valueForKey
Person *person = [[Person alloc] init];
person.cat = [[Cat alloc] init];
[person setValue:@10 forKeyPath:@"cat.weight"];
NSLog(@"%@", [person valueForKeyPath:@"cat.weight"]);
- 相对于
Key
,KeyPath
的功能更加强大。
二、KVC setValue:forKey:
和 valueForKey
的原理
1. setValue:forKey:
设置值的原理流程图
`setValue:forKey:` 设置值的原理流程图
2. valueForKey
取值的原理流程图
`valueForKey` 取值的原理流程图
三、KVC 相关问题解答
1. KVC 会触发 KVO 吗?
-
会!KVC 会触发 KVO
-
我们前面学过 KVO 的本质,其实就是创建一个子类,然后重写 set 方法,新的 set 方法会调用
willChangeValueForKey:
和didChangeValueForKey:
-
然后我们分析 KVC 原理,如果有 set 的方法,那么 KVO 会被触发是可以理解的,但是如果我们通过代码发现,即使没有 set 方法,仅仅 KVC 改变的是成员变量的值,KVO 还是触发了。
-
所以KVC 内部自己的会去调用
willChangeValueForKey:
和didChangeValueForKey:
去触发 KVO。
2. KVC 设置值的过程和 KVC 取值的过程
- 参照上面的原理图