KVO

理解

1.添加响应者,监听对象属性变化,当对象属性改变时调用代理。
2.动态创建NSKVONotifying_XX类,修改被监听对象isa指针指向,只要调用对象的set方法,就会调用NSKVONotifying_XX的set方法。本质:判断对象的set方法有没有被调用

监听一个Person类底层实现
1)、动态创建NSKVONotifying_Person,NSKVONotifying_Person是Person子类,做KVO;
2)、修改当前对象的isa指针->NSKVONotifying_Person;
3)、只要调用对象的set,就会调用NSKVONotifying_Person的set方法;
4)、重写NSKVONotifying_Person的set方法,1[super set:] 2、通知观察者,告诉属性改变。

每个对象都有 isa 指针,指向该对象的类,它告诉 Runtime 系统这个对象的类是什么。所以对象注册为被观察者时,isa 指针指向新子类,那么这个被观察的对象就神奇地变成新子类的对象了。在新类的set方法中会通知观察者。

为了测试kvo的实现方式,我们可以创建一个Person类,然后使用kvo监测name属性,然后在Person类中重写description方法。然后分别在添加kvo监控前后打印对象。

#import "Person.h"
#import <objc/runtime.h>
@implementation Person
-(NSString *)description{
    IMP nameIPM = [self methodForSelector:@selector(setName:)];
    NSLog(@"object address:%p\n  object setName: %p",self,nameIPM);

    Class objectMethodClass = [self class];
    Class objectRuntimeClass = object_getClass(self);
    Class superClass = class_getSuperclass(objectRuntimeClass);
    NSLog(@"objectMethodClass : %@, ObjectRuntimeClass : %@, superClass : %@ \n", objectMethodClass, objectRuntimeClass, superClass);
    return @"";
}

kvo中被观察者不会对观察者进行强引用。

nsnotification中从 iOS 9 开始通知中心会对观察者进行弱引用,所以不需要在观察者对象释放之前从通知中心移除。但是,通过-[NSNotificationCenter addObserverForName:object:queue:usingBlock]方法注册的观察者依然需要手动的释放,因为通知中心对它们持有的是强引用。

kvo缺陷

1.不支持block,代码分散。
2.在调用KVO时需要传入一个keyPath,由于keyPath是字符串的形式,所以其对应的属性发生改变后,字符串不易修改(因为不修改也不会有提示)。

推荐Facebook的一个KVO开源第三方框架-KVOControllerKVOController本质上是对系统KVO的封装,具有原生KVO所有的功能,而且规避了原生KVO的很多问题,兼容blockaction两种回调方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • KVC和KVO在实际的运用中是很常见的。所以了解它的底层实现原理是非常不错的一件事。 KVC(NSKeyValue...
    HelloAda阅读 2,607评论 0 3
  • 前言 Key-Value-Observer,它来源于观察者模式, 其基本思想(copy于某度)是一个目标对象管理所...
    CholMay阅读 3,539评论 6 18
  • 上半年有段时间做了一个项目,项目中聊天界面用到了音频播放,涉及到进度条,当时做android时候处理的不太好,由于...
    DaZenD阅读 3,101评论 0 26
  • 写响应式编程博客时,提到了KVO,今天我们探索一下KVO的实现原理及如何自己实现KVO功能 首先简单的KVO实现 ...
    Yochi阅读 1,797评论 2 2
  • 今天上午,我们行政服务中心大厅民政局结婚登记窗口来了一对特殊的新人。他们是谁?为什么结个婚这么大的阵势?为什么武警...
    沈曼柔阅读 614评论 0 0

友情链接更多精彩内容