1. 什么是KVO
?
-
KVO
全称key-value observeing
;
-
KVO
是OC
中观察者设计模式的
又一个实现;
-
APPLE
使用isa-swizling
混写技术实现KVO
;
2. KVO
实现流程?
KVO的大致流程
-
Object
调用addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>
方法添加监听者;
- 系统在运行时动态创建
NSNotifying_Object
类, 并将换来Obejct
类的isa
指针重新指向新创建的NSNotifying_Object
;
isa
混写技术在KVO
中是如何应用的?
将isa
指针修改进行重新指向的过程就是isa
混写技术在KVO
中的应用;
-
NSNotifying_Object
是Object
的子类, 通过重写NSNotifying_Object
中的setter
方法来通知所有的观察者;
///内部实现
-(void)setCount:(NSInteger)count {
[self willChangeValueForKey:@"keyPath"];
///调用父类实现
[super setCount:count];
///此方法触发监听的实现方法observeValueForKeyPath....
[self didChangeValueForKey:@"keyPath"];
}
第一个断点处, obj类型是AObject
第二个断点处, obj类型是NSNotifying_AObject
示例代码
3. 触发KVO
的方式?
- 通过
Setter
方法赋值;
- 通过
KVC
赋值;
- 通过成员变量赋值+手动触发
///单纯的成员变量赋值, 无法触发KVO
- (void)increaseCount1 {
_count ++;
}
///成员变量赋值+手动触发KVO
- (void)increaseCount2 {
///通过这两个方法可以手动触发KVO
[self willChangeValueForKey:@"count"];
_count ++;
[self didChangeValueForKey:@"count"];
}
示例代码
网友评论