前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS简述KVC和KVO,其中KVO实现原理?

iOS简述KVC和KVO,其中KVO实现原理?

作者头像
赵哥窟
发布2020-06-16 15:04:43
6260
发布2020-06-16 15:04:43
举报
文章被收录于专栏:日常技术分享
KVC

键值编码(Key-Value Coding),它是一种通过key值访问类属性的机制,而不是通过setter/getter方法访问。

KVC 原理
设值的实现

1.首先搜索是否有setKey:的方法,没有则会搜索是否有setIsKey:的方法。

2.如果没有找到setKey:的方法,此时看+ (BOOL)accessInstanceVariablesDirectly; (是否直接访问成员变量)方法。 若返回NO,则直接调用- (nullable id)valueForUndefinedKey:;(默认是抛出异常)。

若返回YES,按 _key、_iskey、key、isKey的顺序搜索成员名。

3.在第二步还没搜到的话就会调用- (nullable id)valueForUndefinedKey:方法。

取值的实现

1.按先后顺序搜索getKey、key、isKey、_getKey、_key五个方法,若某一个方法被实现,取到的即是方法返回的值,后面的方法不再运行。如果是BOOL或者Int等值类型, 会将其包装成一个NSNumber对象。

2.若这五个方法都没有找到,则会调用+ (BOOL)accessInstanceVariablesDirectly方法判断是否允许取成员变量的值。

若返回NO,直接调用- (nullable id)valueForUndefinedKey:(NSString *)key方法,默认是奔溃。

若返回YES,会按先后顺序取_key、_isKey、 key、isKey的值。

3.返回YES时,_key、_isKey、 key、isKey的值都没取到,调用- (nullable id)valueForUndefinedKey:(NSString *)key方法。

KVO

键值观察者 (Key-Value Observer):是苹果提供的一套事件通知机制。允许对象监听另一个对象特定属性的改变,并在改变时接收到事件。

简单的说就是:观察者A监听被观察者B的某个属性,当B的属性发生更改时,A就会收到通知,执行相应的方法。

实现原理

基本的原理:当观察对象A时,KVO机制动态创建一个对象A的子类 NSKVONotifying_A,该类继承自对象A,并为这个新的子类重写观察属性keyPath的setter 方法。setter 方法会负责在调用原 setter 方法之前和之后,通知所有观察对象属性值的更改情况。在这个过程,被观察对象的 isa 指针从指向原来的A类,被KVO机制修改为指向系统新创建的子类NSKVONotifying_A类,来实现当前类属性值改变的监听

如何手动实现KVO?
代码语言:javascript
复制
 [person willChangeValueForKey:@"name"];
  person.name = @"Alex";
 [person didChangeValueForKey:@"name"];
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • KVC
  • KVC 原理
    • 设值的实现
      • 取值的实现
        • KVO
          • 实现原理
            • 如何手动实现KVO?
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档