KVO

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

self.person1监听到了对象属性值发送变化,self.person2没有监听到对象属性值发生变化.本质是什么
KVO
KVO

NSKVONotifying_MJPerson是使用Runtime动态创建的一个类,是MJPerson的子类
KVO
KVO
KVO
KVO
总结
这就是为什么self.person1,和self.person2同样都是调用setAge方法,但是最终走的实现不同,本质原因是,这两个对象的isa不一样,导致两个对象找到的类对象不一样,类对象不一样导致找到类对象方法的实现不同,所以导致两种不同的结果.
验证
KVO
KVO
KVO
KVO
KVO
KVO
KVO
KVO
KVO
苹果重写了class方法返回MJPerson好处就是屏蔽了内部实现,让开发者根本不知道内部怎么实现的,这样的话,开发者也不会多想,因为刚开始就是self.person1 = [[MJPerson alloc]init],所以[self.person1 class]打印出来依然是person类型,所以苹果重写class方法的目的很简单就是屏蔽内部实现,隐藏了NSKVONotifying_MJPerson类的存在,屏蔽了实现,如果要看底层,就用runtime知道它真正的实现,如果NSKVONotifying_MJPerson类不去重写实现class方法 那么调用[self.person1 class]首先会通过self.person1中的isa找到父类NSKVONotifying_MJPerson类方法的实现,由于NSKVONotifying_MJPerson没有class方法,则会通过superclass指针去找到MJPerson的class方法,发现也没有class方法,MJPerson的superclass方法回去找父类NSObject,NSObject默认实现是return object_getClass(self),这样就拿到返回的真正的类型.就拿到了NSKVONotifying_MJPerson类了,所以NSKVONotifying_MJPerson是重新了class方法的.
KVO
KVO
KVO
KVO
直接修改成员变量不会触发KVO
KVO
KVO本质是setter方法重新,只有用setter方法修改的时候即调用setter方法的时候才会修改KVO,而self.person->_age =2直接修改成员变量是不会触发KVO
可以手动触发
KVO

相关文章:

  • 2021-10-04
  • 2021-08-01
  • 2021-10-20
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23