美文网首页
IOS KVO的底层原理

IOS KVO的底层原理

作者: 小豆豆苗 | 来源:发表于2020-02-24 20:14 被阅读0次
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.person1 = [[MJPerson alloc] init];
    self.person1.age = 1;
    
    self.person2 = [[MJPerson alloc] init];
    self.person2.age = 2;
    
    // 给person1对象添加KVO监听
    NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;
    [self.person1 addObserver:self forKeyPath:@"age" options:options context:@"123"];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    self.person1.age = 10;
    self.person2.age = 20;

}

- (void)dealloc {
    [self.person1 removeObserver:self forKeyPath:@"age"];
}

// 当监听对象的属性值发生改变时,就会调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"监听到%@的%@属性值改变了 - %@ - %@", object, keyPath, change, context);
}
打印结果

我们通过上述代码和打印结果可以看到,点击touch之后代码中对person1进行了监听,但是并没有对person2进行监听。但是通过代码可以看到,person1和person2都进行了set操作。我们知道,KVO执行监听就是通过修改某个对象的值从而实现监听效果。那为什么person1和person2之间有区别呢?

KVO的底层原理
我们可以打印person1和person2的isa指针


由上图可以看到,person1的isa指针指向了一个叫NSKVONotifiying_Person类,而person2的isa指针指向的还是Person类。
那么这两者底层的区别在于:
1、person1的isa指针不再指向Person类,而是指向了一个叫NSKVONotifiying_Person的类,这个类里面有一个set方法,通过set方法就会去调用foundation框架里的setValueAndNotify方法实现监听动作。
//方法里面大致步骤如下
{
willChangeValueForkey:
super setValue
didChangeValueForKey:
}
-(void )didChangeValueForKey:(NSString *)key {
//通知监听器
[obersevr observerValueForKeyPath:];
}
使用KVO监听对象时set方法示意图

2、person2的isa指针会向Person类中去寻找set方法,找到之后就调用。

未使用KVO时调用set方法示意图
总结:KVO之所以能实现监听,是因为它的底层是runtime机制,利用runtime的API生成一个子类NSKVONotifiying_XXX,并让实例对象的isa指向这个全新的子类,当修改属性的值时,会调用foundation框架里面的setValueAndNotify方法,在内部触发监听器的监听方法。

相关文章

  • IOS底层(三) KVO底层实现原理

    @[TOC](IOS底层(三) KVO底层实现原理 ) 一,KVO简述 KVO的全称 Key-Value Obse...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • 底层原理

    iOS底层原理总结 - Category的本质 KVO详解及底层实现青少年一定要读的KVO指南 iOS 底层解析w...

  • iOS-底层原理21-KVO(下)

    iOS-底层原理21-KVO(下) 《iOS底层原理文章汇总》[https://www.jianshu.com/p...

  • Objective-C的本质(4)—— KVO本质

    参考:iOS底层原理总结 - 探寻KVO本质iOS-KVO本质 问题一:kvo如果找到对应的属性 KVO不存在查找...

  • KVC

    KVC原理剖析 - CocoaChina_让移动开发更简单 iOS开发底层细究:KVC和KVO底层原理 | iOS...

  • iOS KVO 基础与底层原理

    iOS KVO 基础与底层原理 KVO基础 KVO是通过给对象object的属性property注册observe...

  • 关于KVO底层Runtime实现的那点事

    有很多公司iOS面试都会被问到KVO底层的实现。网上也有很多篇关于KVO的底层原理,但是都是用willChange...

  • 自定义KVO

    导语: 如果对KVO原理不是很熟悉的,可以参考下简书另一篇文章《ios KVO原理探究》,主要是通过模拟KVO底层...

  • iOS-底层原理-自定义KVO

    1.自定义KVO 1.上一篇博客了解了iOS 系统KVO的底层实现原理,那么这里进行自定义KVO,更好的理解原理和...

网友评论

      本文标题:IOS KVO的底层原理

      本文链接:https://www.haomeiwen.com/subject/ryxiqhtx.html