美文网首页ios底层原理
iOS学习之彻底搞清楚KVC/KVO

iOS学习之彻底搞清楚KVC/KVO

作者: 北你妹的风 | 来源:发表于2018-03-07 12:05 被阅读23次

这篇主要讲KVO的底层原理,顺便讲一下KVC。

先说一下KVC吧,KVC(key-value-coding)提供了一种通过字符串访问对象属性的机制,而不是调用对象的setter、getter方法。NSObject一个分类中实现了KVC,所以OC中所有对象都可以使用KVC。

对于对象的成员变量使用点语法(setter和getter方法)和KVC差别不大,但KVC神奇的是可以访问私有属性,也就是没有提供setter和getter方法的属性。举个例子:

UIPageControl*pageControl = [[UIPageControlalloc] init];

 [pageControl setValue:[UIImageimageNamed:@"xxx.png"] forKeyPath:@"_pageImage"];

 [pageControl setValue:[UIImageimageNamed:@"xxx.png"] forKeyPath:@"_currentPageImage"]

_pageImage和_currentPageImage并不是UIPageControl对外公布的属性,直接用点语法是访问不到的,所以这里就使用了KVC进行赋值。

接着来讲今天的重点:KVO(Key-Value-Observe)

KVO本质上是观察者模式的一种实现,它提供一种机制,当指定对象的属性被修改后,则对象就会接受到通知。简单的说,就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。具体用法:

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

 p.age = 20;   //原始值

 [p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];  //注册观察者  

p.age=30;//修改值,此时便会触发KVO提供的监听函数:

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

    NSLog(@"%@对象的%@属性改变了,由旧值%@改变为新值%@", object, keyPath, change[@"old"], change[@"new"]);  

}  

那么KVO具体是怎么实现的呢?

一句话总结:对象在第一次添加监听的时候,系统会动态的新生成一个原对象类的子类,结合上面的例子就是NSKVONotifying_Person类,然后重写该子类的setter方法,重写的setter方法里面回调用willChangeValue和didChangeValue方法。同时,原对象的isa指针会指向新生成的子类。这样,当对象再调用属性的setter方法时,其实调用的是子类的settet方法,从而实现属性变化的监听。

这里是通过runtime动态生成类,涉及到方法有:

object_getClass(p)//获得对象所属的类,也就是isa指针

object_setClass(p, newClass);//设置对象所属的类,改变isa指针的指向

class_addMethod(newClass,selectorName, (IMP)newsetter,types)//类添加方法及实现

Class newClass=objc_allocateClassPair(originClass, kvoClassName.UTF8String, 0)//新申请指定名字的类

objc_registerClassPair(newClass)//向系统注册新申请的类

总结:其实是新的类,新的方法去做的监听,虽然看上去像是原来的类。

相关文章

  • iOS学习之彻底搞清楚KVC/KVO

    这篇主要讲KVO的底层原理,顺便讲一下KVC。 先说一下KVC吧,KVC(key-value-coding)提供了...

  • KVC 和 KVO

    iOS-KVC和KVO精炼讲解(干货)KVC 和 KVOiOS开发系列--Objective-C之KVC、KVO细...

  • KVC

    iOS 如何使用KVC iOS开发UI篇—Kvc简单介绍 iOS开发系列--Objective-C之KVC、KVO

  • KVC、KVO

    IOS开发系列--Objective-C之KVC、KVO - KenshinCui - 博客园

  • iOS基础(四) - KVC和KVO

    iOS观察者模式学习 (1)KVC与KVO简介 KVC KVC(Key-value coding)是一种间接更改对...

  • iOS - KVO

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

  • iOS-KVO浅谈

    上一篇:iOS-KVC浅谈 前言:KVO 作为 KVC 的同袍兄弟,功能更强大,聊聊 KVO。 一、KVO 简介 ...

  • ReactiveCocoa相关

    随手记录: 1、iOS开发系列--Objective-C之KVC、KVO 2、ReactiveCocoa初探

  • iOS日记15-KVC

    1.iOS开发技巧系列---详解KVC 2.漫谈 KVC 与 KVO 3.KVC/KVO原理详解及编程指南 关键点...

  • iOS面试题:KVC的赋值和取值过程是怎样的?KVO原理是什么?

    更多:iOS面试题大全 1、KVC赋值 2、 KVC取值 3、 KVO原理 KVO 是 Objective-C 对...

网友评论

    本文标题:iOS学习之彻底搞清楚KVC/KVO

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