李洪强经典面试题51-KVO-KVC

 

KVC-KVO

KVC的底层实现?

当一个对象调用setValue方法时,方法内部会做以下操作:
①检查是否存在相应key的set方法,如果存在,就调用set方法
②如果set方法不存在,就会查找与key相同名称并且带下划线的成员属性,如果有,则直接给成员属性赋值
③如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值
④如果还没找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。
KVO的底层实现?
- kvo基于runtime机制实现。
- 使用了isa 混写(isa-swizzling),当一个对象(假设是person对象,person的类是MYPerson)的属性值(假设person的age)发生改变时,系统会自动生成一个类,继承自MYPerson :NSKVONotifying_MYPerson,在这个类的setAge方法里面,调用[super setAge:age] [self willChangeValueForKey:@"age"] 和 [self didChangeValueForKey:@"age"]
,而这两个方法内部会主动调用监听者内部的 - (void)observeValueForKeyPath 这个方法。
- 想要看到NSKVONotifying_MYPerson很简单,在self.person.age = 20; 这里打断点,在调试区域就能看到 _person->NSObject->isa=(Class)NSKVONotifying_MYPerson.同时我们在 self.person = [[MYPerson alloc]init];后面打断点,看到_person->NSObject->isa=(Class)MYPerson,由此可见,在添加监听者之后,person类型已经由MYPerson被改变成NSKVONotifying_MYPerson

什么是KVO和KVC?

答:KVC:键 – 值编码 使用字符串直接访问对象的属性。
KVO:键值观察机制,它提供了观察某一属性变化的方法

KVO的缺陷?

KVO是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。前面两种模式更加适合一个controller与任何其他的对象进行通信,而KVO更加适合任何类型的对象侦听另外一个任意对象的改变(这里也可以是controller,但一般不是controller)。这是一个对象与另外一个对象保持同步的一种方法,即当另外一种对象的状态发生改变时,观察对象马上作出反应。它只能用来对属性作出反应,而不会用来对方法或者动作作出反应。

优点:

1.能够提供一种简单的方法实现两个对象间的同步。例如:model和view之间同步;

2.能够对非我们创建的对象,即内部对象的状态改变作出响应,而且不需要改变内部对象(SKD对象)的实现;

3.能够提供观察的属性的最新值以及先前值;

4.用key paths来观察属性,因此也可以观察嵌套对象;

5.完成了对观察对象的抽象,因为不需要额外的代码来允许观察值能够被观察

缺点:

1.我们观察的属性必须使用strings来定义。因此在编译器不会出现警告以及检查;

2.对属性重构将导致我们的观察代码不再可用;

3.复杂的“IF”语句要求对象正在观察多个值,这是因为所有的观察代码通过一个方法来指向;

4.当释放观察者时需要移除观察者。

文章如有问题,请留言,我将及时更正。

李洪强经典面试题136-KVO-KVC的更多相关文章

  1. 李洪强经典面试题51-KVO-KVC

    李洪强经典面试题51-KVO-KVC   KVC-KVO KVC的底层实现? 当一个对象调用setValue方法时,方法内部会做以下操作: ①检查是否存在相应key的set方法,如果存在,就调用set ...

  2. 李洪强经典面试题152-Runtime

    李洪强经典面试题152-Runtime   Runtime Runtime是什么 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码, ...

  3. 李洪强经典面试题49-Objective-C

    李洪强经典面试题49-Objective-C 面试笔试都是必考语法知识的.请认真复习和深入研究OC. Objective-C 方法和选择器有何不同?(Difference between method ...

  4. 李洪强经典面试题145-Runloop

    李洪强经典面试题145-Runloop   Runloop 什么是 Runloop? 从字面上讲就是运行循环. 它内部就是do-while循环,在这个循环内部不断地处理各种任务. 一个线程对应一个Ru ...

  5. 李洪强经典面试题53-Swift

    李洪强经典面试题53-Swift Swift 网上有很多Swift的语法题,但是Swift现在语法还未稳定,所以在这里暂时不贴出语法题,可以自行搜索. Swift和Objective-C的联系 Swi ...

  6. 李洪强经典面试题52-Block

    李洪强经典面试题52-Block   Block Block底层原理实现 首先我们来看四个函数 void test1() { int a = 10; void (^block)() = ^{ NSLo ...

  7. 李洪强经典面试题31- FMDB

    n什么是FMDB pFMDB是iOS平台的SQLite数据库框架 pFMDB以OC的方式封装了SQLite的C语言API p nFMDB的优点 p使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 ...

  8. 李洪强经典面试题48-C语言

    可能碰到的iOS笔试面试题(4)--C语言   C语言,开发的基础功底,iOS很多高级应用都要和C语言打交道,所以,C语言在iOS开发中的重要性,你懂的.里面的一些问题可能并不是C语言问题,但是属于计 ...

  9. 李洪强经典面试题47--UNIX常用命令

    可能碰到的iOS笔试面试题(3)--UNIX常用命令 做开发说用不到命令行,那肯定是不可能的.所以记住几个常用的命令还是很有用. cd 改变工作目录 pwd 输出当前工作目录的绝对路径在UNIX中要执 ...

随机推荐

  1. [Outlook] outlook如何实现自动CC和BCC邮件发送

    由于需要在不同机器上发送邮件,最终发送的邮件会在不同的机器上,最终导致邮件丢失,以后想找也找不回来,故在网上搜索一翻,找到解决办法. 1. 实现自动CC邮件发送: 方法:使用outlook的配置规则 ...

  2. ASP.NET 5 Beta8发布及升级经验

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ASP.NET 5 Beta8如期发布,这是一个重要的里程碑,因为这是ASP.NET ...

  3. unfortunately launcher has stopped

    设定虚拟机的配置.

  4. POJ 1987 Distance Statistics 树分治

    Distance Statistics     Description Frustrated at the number of distance queries required to find a ...

  5. barabasilab-networkScience学习笔记6-evolving networks

    第一次接触复杂性科学是在一本叫think complexity的书上,Allen博士很好的讲述了数据结构与复杂性科学,barabasi是一个知名的复杂性网络科学家,barabasilab则是他所主导的 ...

  6. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  7. iOS10 UI教程视图的生命周期

    iOS10 UI教程视图的生命周期 说到视图的生命周期一般都是指视图控制器的视图生命周期.在视图的声明周期中最主要的有8个方法,分别为loadView().viewDidLoad().viewWill ...

  8. zepto的bug1

    给页面<a>标签绑定了tap事件,在移动设备上点击按钮貌似一切正常,可以正常响应. 但是,把页面上下滑动几次之后,或者在滑动时手指滑动出移动屏幕之外,之后再点击按钮,就会发现第一次点击的时 ...

  9. BZOJ 3282 Tree ——KD-Tree

    [题目分析] 明显的LCT维护连通性的题目. access的操作是比较巧妙的,可以把结点到根变成偏爱路径,而且保证了该点是链上深度最深的点. 而且需边的思想也很巧妙,保证了复杂度. 但是只能用于修改路 ...

  10. section和article元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...