KVO 底层实现

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@property(nonatomic ,strong)Person * people;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    Person * people = [[Person alloc]init];

    self.people = people;

    people.name = @"xiaohua";

    people.age = 10;

    //KVO 键值监听 , 当监听某个类的某一个成员属性时,当这个成员属性的值发生改变时,做出响应

    //key与keyPath 的区别: key 值找一层, 也就本类的的属性, 而keyPath 则可以向下寻找多层,也就是如果本类没有, 就向其子类中寻找, 如果都没有找到,就直接报错

    [people addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld  context:nil];

    //KVO 的底层实现: 当程序运行到上一行代码时, 也就是给属性添加监听者时,此时动态生成一个NSKVONotifying_子类,并修改之前类的isa指针,将当前类的isa指针修改为动态生成的子类的isa指针,然后当给类的属性赋值时, 就会调用子类的的set方法,根据监听者的参数,保存相应的数据,然后在set方法中调用父类的set方法,将值赋值给父类属性,然后调用observeValueForKeyPath 告诉监听者,属性的值发送改变了

}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    self.people.age =10;
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{

    NSLog(@"%@" , change);

}
时间: 2024-11-05 06:26:30

KVO 底层实现的相关文章

KVO底层实现原理,仿写KVO

这篇文章简单介绍苹果的KVO底层是怎么实现的,自己仿照KVO的底层实现,写一个自己的KVO监听 #pragma mark--KVO底层实现 第一步:新建一个Person类继承NSObject Person.h #import <Foundation/Foundation.h> @interface Person : NSObject //字符串类型的属性name @property (nonatomic, strong) NSString *name; @end Person.m #impor

通过子类实现KVO,浅析KVO底层原理

通过手动实现KVO,对KVO底层原理有一定认识. KVO只要是通过监听set方法,从而实现对该对象的监听. 要监听set方法,有两种实现方式,第一就是使用分类,重写set方法,但是这样就会覆盖父类的set方法,所以不可行,pass掉. 第二就是使用子类,把父类的isa指针改为子类.然后调用父类色set方法,最后调用回调方法,该方案可行. 首先是注册监听,在调用监听方法的时候,会动态实现子类,把observer保存到子类的属性中(弱引用weak类型,不能使用strong,会造成循环引用),并且把类

KVO底层实现原理

(KVO)键值观察者底层解析 涉及到了runtime,关于isa指针 手动实现键值观察(代码示例) 被观察的对象Target(重写setter/getter方法)Target.h @interface Target : NSObject { int age; } // for manual KVO - age- (int) age; - (void) setAge:(int)theAge; @end Target.m @implementation Target - (id) init{ sel

KVO 底层原理详解

基本原理-> 给一个对象的属性添加监听 当属性值发生变化时 会触发监听器的监听的方法 #import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic, strong) Person *p; @end @implementation ViewController - (void)viewDidLoad { [super viewDidL

NotificationCenter KVC KVO Delegate总结

KVO(Key-Value- Observing): 一对多, 观察者模式,键值观察机制,它提供了观察某 一属性变化的方法,极大简化了代码. KVO底层实现: - kvo 是基于 runtime 机制实现 - 使用了 isa 混写 isa-swizzling ,当一个对象( 假设是person对象,   person的类是MYPerson)的属性值(假设 person 的 age 属性)发生改变时,系统会自动生成一个类,继承自  MYPerson : NSKVONotifying_MYPerso

KVO你所不知道的&quot;坑&quot;

一.什么是 KVO 首先让我们了解一下什么KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.键值观察Key-Value-Observer就是观察者模式. 观察者模式的定义:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象.这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的.观察者模式较完美地将目标对象与观察者对象解耦. KVO和KVC没有什么关系,要说有关系的话也就是--K

KVO中你所不知道的&quot;坑&quot;

一.什么是 KVO 首先让我们了解一下什么KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.键值观察Key-Value-Observer就是观察者模式. 观察者模式的定义:一个目标对象管理所有依赖于它的观察者对象,并在它自身的状态改变时主动通知观察者对象.这个主动通知通常是通过调用各观察者对象所提供的接口方法来实现的.观察者模式较完美地将目标对象与观察者对象解耦. KVO和KVC没有什么关系,要说有关系的话也就是--K

关于KVO的技巧

1.在父类中注册KVO 子类中KVO不相应的解决办法 在父类中通过判断发送对象的类是不是父类或者子类 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { //区分子类和父类KVO 简单判断 if (object == self) { if ([keyPath isEqualToString:@"x&

iOS开发-开发总结(四)

一:send和awk解释 sed -n p filenamesed ----------------------------是一个流编辑器(stream editor) awk ‘BEGIN {print “Hellow"}'awk --------是一种用于处理文本的编程语言工具. 二:传值方式总结 KVO底层会动态长生新的类,只能坚挺属性(一个对象的属性能背多个兑现监听,一个对象能监听多个对象的其他属性) kvc/kvo底层是基于runtime 代理,规范,代码多:一对一 通知,发送和接收: