美文网首页
KVO的本质

KVO的本质

作者: 有毒的程序猿 | 来源:发表于2018-12-20 17:57 被阅读8次
1.生成子类
系统会通过runtime动态生成一个名为NSKVONotifying_xxx(被监听类名)继承自被监听类的子类
例如 YHObject  -> NSKVONotifying_YHObject
调用方法 objc_allocateClassPair([YHObject class], "YHObject", 0);
 
 @interface YHObject : NSObject
 
 @property (nonatomic, assign) int age;
 
 @end
 
 @implementation YHObject
 
 @end
 
 
 @interface NSKVONotifying_YHObject : YHObject
 
 @end
 
 @implementation NSKVONotifying_YHObject
 
 - (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];
 }
 
 // 屏幕内部实现,隐藏了NSKVONotifying_MJPerson类的存在
 - (Class)class
 {
     return [YHObject class];
 }
 
 - (void)dealloc
 {
 // 收尾工作
 }
 
 - (BOOL)_isKVOA
 {
 return YES;
 }

 @end
2.重写父类的set方法
  子类重写被监听属性的set方法,在set方法里面调用  _NSSetIntValueAndNotify();
  
  _NSSetIntValueAndNotify的大概实现是这样的
  [self willChangeValueForKey:@"age"];  // 将会改变
  [super setAge:age];                   // 调用父类的set方法给成员变量赋值
  [self didChangeValueForKey:@"age"];   // 改变

  didChangeValueForKey
  通知监听器某某属性发生了改变既调用公共的方法
  [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];
3子类重写class方法
// 返回原来的类来迷惑开发者,隐藏实现原理
  - (Class)class
  {
      return [YHObject class];
  }

相关文章

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

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

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

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

  • 深入理解KVO

    iOS | KVO | Objective-C KVO的本质是什么,如何手动触发KVO? 1.什么是KVO KVO...

  • 04. KVO使用,原理,本质

    问题 KVO日常使用 KVO原理(KVO本质是什么) 如何手动触发KVO 直接修改成员变量会触发KVO吗 KVO图...

  • KVO

    0:KVO的使用步骤 1:KVO本质 methodForSelector方法 NSKVONotifying_Per...

  • 探索中的KVO

    探索KVO的本质 什么是KVO KVO的全称就是Key-Value Observing ,俗称“键值监听”。用于监...

  • iOS KVO

    什么是KVO KVO俗称“键值监听”,用来监听某个对象属性值的改变 KVO的使用 KVO 本质 在给某个对象添加K...

  • iOS-KVO本质

    参考篇:iOS-KVO浅谈 前言:本文简述KVO本质,如有错误请留言指正。 什么是KVO? KVO的全称是Key-...

  • 03-OC中KVO的底层原理

    KVO本质 什么是KVO? KVO:Key-Value Observing,用来监听类的某个对象的某个属性的值发生...

  • 小码哥底层原理笔记:KVO的本质

    使用KVO主要是监听属性的变化。简单的KVO如下: KVO的本质 当我们给person1增加KVO后修改age的值...

网友评论

      本文标题:KVO的本质

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