KVO总结

作者: 斑驳的流年无法释怀 | 来源:发表于2018-08-18 11:42 被阅读13次

KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变

image.png

查看被监听对象的isa

(lldb) p self.person1.isa
(Class) $0 = NSKVONotifying_LQPerson
  Fix-it applied, fixed expression was: 
    self.person1->isa
(lldb) p self.person1->isa
(Class) $1 = NSKVONotifying_LQPerson

** 查看对象添加监听前后的方法**

NSLog(@"person1添加KVO监听之后 %p", [self.person1 methodForSelector:@selector(setAge:)]

(lldb) p (IMP)0x109e3b570
(IMP) $1 = 0x0000000109e3b570 (Interview01`-[LQPerson setAge:] at LQPerson.m:13)
(lldb) p (IMP) 0x10a1e2f8e
(IMP) $2 = 0x000000010a1e2f8e (Foundation`_NSSetIntValueAndNotify)

通过获取对象的类对象和元类对象打印可知,两个地址完全不同,意味着,runtime生成的这个类对象的元类是它自己的元类对象,而不是之前对象的元类

我们可以通过runtime查看新的类有哪些方法
为什么没有重写get方法?因为父类已经有了

_NSSetValueAndNotify的内部实现*

image.png
  1. 调用willChangeValueForKey:
  2. 调用原来的setter实现
  3. 调用didChangeValueForKey:
    didChangeValueForKey:内部会调用observer的observeValueForKeyPath:ofObject:change:context:方法

伪代码

- (void)setAge:(int)age
{
    _NSSetIntValueAndNotify();
}

//伪代码
void _NSSetIntValueAndNotify()
{
    [self willChangeValueForKey:@"age"];
    [super setAge:age];
    [self didChangeValueForKey:@"age"];
}

- (void)didChangeValueForKey:(NSString *)key
{
    //通知监听器
    [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];
}

QA

  • iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
    利用RuntimeAPI动态生成一个子类,并且让instance对象的isa指向这个全新的子类
    当修改instance对象的属性时,会调用Foundation的_NSSetXXXValueAndNotify函数
    willChangeValueForKey:
    父类原来的setter
    didChangeValueForKey:
    内部会触发监听器(Oberser)的监听方法( observeValueForKeyPath:ofObject:change:context:)

  • 如何手动触发KVO?
    手动调用willChangeValueForKey:和didChangeValueForKey:

  • 直接修改成员变量会触发KVO么?
    不会触发KVO

相关文章

  • iOS原理篇(一): KVO实现原理

    KVO实现原理 什么是 KVO KVO 基本使用 KVO 的本质 总结 一 、 什么是KVO KVO(Key-Va...

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

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

  • iOS知识体系总结-KVO&KVC

    注意:更新内容会同步到GitHub iOSWiki-知识体系总结 总结-KVO&KVC iOS知识点/KVO&KV...

  • OC基础-KVO(2)

    kvo总结问题:iOS用什么方式实现一个KVO?(KVO的本质是什么)答:利用RuntimeAPI动态生成一个子类...

  • 从网上收集的一些关键知识点总结

    iOS 中KVC、KVO、NSNotification、delegate 总结及区别

  • KVO总结

    KVO是键值对观察,是NSObject的非常正式协议。当创建一个类对象中的属性进行观察的时候,其实在运行的时候,自...

  • KVO总结

    KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变 查看被监...

  • KVO总结

    // // CBRectPositionController.m // KVOPractice // // Cre...

  • iOS-KVC/KVO常见面试题

    iOS面试中,KVC、KVO是经常涉及到的一个面试点,下面来总结一下常见的面试题类型。 一、 KVO 1.KVO的...

  • KVC和KVO总结

    引言 今天看了KVC和KVO的视频,总结一下,便于以后回顾。KVC地址KVO地址 KVC(key-value-co...

网友评论

      本文标题:KVO总结

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