美文网首页
KVO底层实现原理

KVO底层实现原理

作者: 西门丨不吹雪 | 来源:发表于2019-03-01 16:56 被阅读0次

添加观察者方法实现原理

#import "NSObject+KVO.h"
#import "XMKVONotifying_Person.h"
#import <objc/runtime.h>

@implementation NSObject (KVO)

-(void)XM_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:      (NSKeyValueObservingOptions)options context:(void *)context
{
 //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,本质就是改变当前对象的类名
object_setClass(self, [XMKVONotifying_Person class]);

把观察者保存到当前对象里
// 添加关联
// id object:给哪个对象添加关联属性
// key:属性名
// value:关联值
objc_setAssociatedObject(self, @"key", observer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}


#import "XMKVONotifying_Person.h"
#import <objc/runtime.h>

@implementation XMKVONotifying_Person

监听方法自动调用实现原理

-(void)setAge:(NSInteger)age
{
[super setAge:age];

// 通知观察者,属性改变
id observer = objc_getAssociatedObject(self, @"key");

[observer observeValueForKeyPath:@"age" ofObject:self change:nil context:nil];
}

相关文章

  • Today面试

    Runloop 底层原理Kvo 底层原理ARC 底层原理 如何实现GCD 底层原理Block 底层原理Aut...

  • IOS底层(三) KVO底层实现原理

    @[TOC](IOS底层(三) KVO底层实现原理 ) 一,KVO简述 KVO的全称 Key-Value Obse...

  • iOS - KVO

    [toc] 参考 KVO KVC 【 iOS--KVO的实现原理与具体应用 】 【 IOS-详解KVO底层实现 】...

  • KVO的底层实现原理

    KVO的底层实现原理
    KVO的定义(Key-Value Observing) ...

  • iOS - 自定义KVO

    之前我们已经了解过了KVO的底层实现原理,不过呢,在我们开始实现自定义KVO之前再来简单回顾下KVO的实现原理 1...

  • iOS开发面试攻略(KVO、KVC、多线程、锁、runloop、

    KVO & KVC KVO用法和底层原理 使用方法:添加观察者,然后怎样实现监听的代理 KVO底层使用了 isa-...

  • 底层原理

    iOS底层原理总结 - Category的本质 KVO详解及底层实现青少年一定要读的KVO指南 iOS 底层解析w...

  • 2018-02-14

    探究KVO的底层实现原理 addObserver:forKeyPath:options:context:各个参数的...

  • 关于KVO底层Runtime实现的那点事

    有很多公司iOS面试都会被问到KVO底层的实现。网上也有很多篇关于KVO的底层原理,但是都是用willChange...

  • iOS --- KVO

    KVO 的底层实现原理 (1)KVO 是基于 runtime 机制实现的 (2)假如有个对象DoLin(类型为Do...

网友评论

      本文标题:KVO底层实现原理

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