一、KVC
KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。
目的
- 间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度。
基本使用
-
setValue: forKey
、valueForKey:
和setValue: forKeyPath
、valueForKeyPath:
两组方法 -
forkey
和forKeyPath
的区别在于,forKeyPath
是可以多深层次访问的。例如:有两个类 Psrson 和 Student,Psrson 类里面有个Student 类型的对象 student ,Student 类里面有个 score 属性。那么就可以这么使用:[person setValue:@80 forKeyPath:@"student.score" ]
使用场景
- 通过键值路径动态获取或设置对象的属性;
- 模型和字典转换(
setValuesForKeysWithDictionary:
); - 修改一些控件的内部属性(例如个性化UITextField中的
placeHolderText
的属性); - 访问和修改私有变量,对于类里的私有属性,Objective-C是无法直接访问的,但是KVC是可以的。
二、KVO
KVO(Key-Value Observing)键值观察。它是一种观察者模式的衍生。其基本思想是,对目标对象的某属性添加观察,当该属性发生变化时,通过触发观察者对象实现的KVO接口方法,来自动的通知观察者。
目的
- 就是监听某个对象的属性,在该属性的值发生变化时,通知观察者,及时作出响应。
使用步骤
//1、给对象的属性添加观察者
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"myObserver"];
//2、若该属性发生改变,系统自动调用下面的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context;
//3、所有观察者模式的性能都不好,需要及时移除
[person removeObserver:self forKeyPath:@"name"];
使用场景
- 下拉刷新、下拉加载监听UIScrollView的
contentoffsize
; - webview混排监听
contentsize
; - 监听模型属性实时更新UI;
- 监听控制器
frame
改变,实现抽屉效果。