知识点总结

iOS KVO

2019-04-11  本文已影响2人  飞不越疯人院

1. 什么是KVO?

  1. KVO全称key-value observeing;
  2. KVOOC观察者设计模式的又一个实现;
  3. APPLE使用isa-swizling混写技术实现KVO;

2. KVO实现流程?

KVO的大致流程
  1. Object调用addObserver:<#(nonnull NSObject *)#> forKeyPath:<#(nonnull NSString *)#> options:<#(NSKeyValueObservingOptions)#> context:<#(nullable void *)#>方法添加监听者;
  2. 系统在运行时动态创建NSNotifying_Object类, 并将换来Obejct类的isa指针重新指向新创建的NSNotifying_Object ;

isa混写技术在KVO中是如何应用的?
isa指针修改进行重新指向的过程就是isa混写技术在KVO中的应用;

  1. NSNotifying_ObjectObject的子类, 通过重写NSNotifying_Object中的setter方法来通知所有的观察者;
///内部实现
-(void)setCount:(NSInteger)count {
    [self willChangeValueForKey:@"keyPath"];
    ///调用父类实现
    [super setCount:count];
    ///此方法触发监听的实现方法observeValueForKeyPath....
    [self didChangeValueForKey:@"keyPath"];
}
第一个断点处, obj类型是AObject
第二个断点处, obj类型是NSNotifying_AObject
示例代码

3. 触发KVO的方式?

  1. 通过Setter方法赋值;
  2. 通过KVC赋值;
  3. 通过成员变量赋值+手动触发
///单纯的成员变量赋值, 无法触发KVO
- (void)increaseCount1 {
    _count ++;
}

///成员变量赋值+手动触发KVO
- (void)increaseCount2 {
    ///通过这两个方法可以手动触发KVO
    [self willChangeValueForKey:@"count"];
    _count ++;
    [self didChangeValueForKey:@"count"];
}

示例代码

上一篇下一篇

猜你喜欢

热点阅读