你可不能输!ZJ_iOS面试

KVO的实现原理

2015-09-24  本文已影响462人  木_木27

KVO的一般使用场景:

- (void)viewDidLoad {
    [super viewDidLoad];
    DuPerson *p = [[DuPerson alloc] init];
    p.age = 1;
    [p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
    p.age = 3;
}
- (void)dealloc{
    [self.p removeObserver:self forKeyPath:@"age"];
}

/ *  @param keyPath 被修改的属性
 *  @param object  被修改的属性所属的对象
 *  @param change  属性改变情况(新旧值)
 *  @param context void * == id
 *  /
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
    NSLog(@"%@对象的%@属性改变了:%@",object,keyPath,change);
}
/************************ NSLog ***************************/
<DuPerson: 0x7fc5a3519920>对象的age属性改变了:{
    kind = 1;
    new = 3;
    old = 1;
}

KVO的实现原理

DuPerson *p = [[DuPerson alloc] init];
p.age = 1;
p.age = 3;

通过断点调试可以看到p里面的isa指针指向的是DuPerson,如下图

没实现KVO
但是isa又是什么东西了,先不着急,我们再来看看有KVO的情况下
DuPerson *p =[[DuPerson alloc] init];
p.age = 2;
[p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
p.age = 5;

通过断点调试可以看到p里面的isa指针指向的是NSKVONOtifying_DuPerson,也就是说p指针指向的对象的类型应经发生改变了

实现KVO
- (void)setAge:(NSInteger)age{
    [super setAge:age];
//    [监听器 observeValueForKeyPath:@"age" ofObject:self change:@{} context:nil];
}
上一篇下一篇

猜你喜欢

热点阅读