iOS KVO和KVC介绍

KVO和KVC都是基于对NSObject的扩展来实现的,所有继承于NSObject的子类都能使用KVO和KVC。

用来测试的model:

@interface User : NSObject
@property (assign, nonatomic) NSInteger uid;
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) Float64 height;
@property (strong, nonatomic) User *subUser;
@end

KVO

KVO全称Key Value Observing。使用KVO可以监听对象的某个key或者keyPath它的value值的变化。

  • key可以视为对象的属性
  • keyPath是针对对象的属性也是一个对象的情况,使用"object.property"的形式来访问属性对象(object)的属性(property)
  • 对象的属性修改之后马上就会同步调用观察者的observeValueForKeyPath:ofObject:change:context:方法。等该方法执行完毕之后才会返回修改的位置执行之后的逻辑。
  • 在添加观察者的时候需要添加option:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew,这样在回调observeValueForKeyPath的时候就可以通过change字典:change[“new”]和change[“old”]来获取新旧值。

示例:

{User *user = [User new];user.name = @"an old name";[user addObserver:self forKeyPath:NSStringFromSelector(@selector(name)) options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];NSLog(@"准备修改user.name");user.name = @"a new name";NSLog(@"修改user.name完成");
}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{NSLog(@"观察到user.name发生变化, old:%@, new:%@", change[@"old"], change[@"new"]);NSLog(@"user.class: %@", [NSString stringWithUTF8String: class_getName([object class])]);
}

运行结果:

2019-07-19 14:22:35.595521+0800 MakeStrong[4975:90955] 准备修改user.name
2019-07-19 14:22:35.595731+0800 MakeStrong[4975:90955] 观察到user.name发生变化, old:an old name, new:a new name
2019-07-19 14:22:35.595817+0800 MakeStrong[4975:90955] user.class: User
2019-07-19 14:22:35.595920+0800 MakeStrong[4975:90955] 修改user.name完成

上述代码我们使用了NSStringFromSelector(@selector(name))来 获取属性名,是为了避免硬编码。

KVC

KVC全称Key Value Coding。使用KVC可以不需要调用getter跟setter就可以获取和修改对象的属性值。KVC同样也是有key和keyPath的概念。

修改value的方法:

获取value的方法:

示例:

    //KVCUser *user = [User new];user.subUser = [User new]; //首先需要实例化subUser,否则下面的setValue会无效[user setValue:@"momingqi" forKeyPath:@"subUser.name"]; //修改user.subUser.name属性NSString *subUserName = [user valueForKeyPath:@"subUser.name"];NSLog(@"%@", subUserName);

KVC中还有两个特殊的方法:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;

  • 这个方法需要NSObject的子类重写,否则会抛出异常NSUndefinedKeyException。
  • (id)valueForUndefinedKey:(NSString *)key;

iOS KVO和KVC介绍相关推荐

  1. iOS KVO和KVC

    一.KVO全称key value observing,是苹果提供的一套事件通知机制,俗称键值监听. 1.注册观察者 /* @observer:就是观察者,是谁想要观测对象的值的改变. @keyPath ...

  2. [iOS]-KVO+KVC

    目录: 参考的博客: KVO 什么是KVO KVO的基本使用 KVO使用注意事项 手动调用KVO KVO本质 NSKVONotifying_Apple内部实现 setter的实现不同 KVO部分相关问 ...

  3. Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍

    原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iO ...

  4. KVO 和 KVC 的区别?

    KVO 和 KVC 的区别? key value coding   ,key value observer KVC 是 路径访问的规范 KVO 观察某个变量的变化过程    它提供一种机制,当指定的对 ...

  5. iOS开发面试攻略(KVO、KVC、多线程、锁、runloop、计时器)

    KVO & KVC KVO用法和底层原理 使用方法:添加观察者,然后怎样实现监听的代理 KVO底层使用了 isa-swizling的技术. OC中每个对象/类都有isa指针, isa 表示这个 ...

  6. ios中的KVC和KVO

    最近研究了一下子KVC和KVO,KVC:即Key-Value-Coding 而KVO:即Key-Value-Observer KVC是针对NSObject的子类,因为它的实现是由于其括展类NSObje ...

  7. iOS KVO KVC

    键值观察:值更改时通知观察者 键值观察(Key-value observing,或简称 KVO)允许对象观察另一个对象的属性.该属性值改变时,会通知观察对象.它了解新值以及旧值:如果观察的属性为对多的 ...

  8. ios kvo 要引入_腾讯社招iOS面试记录

    毕业好几年了,上周发送了简历给腾讯,参加了腾讯面试.具体部门这边就不说了.这次面试还是收获到了很多. 一面电话面试: 面试官主要是针对iOS相关的基础问题. 先简单自我介绍一下自己 对mrc和arc的 ...

  9. ios kvo 要引入_iOS多线程之超实用理论+demo演示(可下载)

    [toc] 背景简介 在初学iOS相关知识过程中,大多都对多线程有些恐惧的心里,同时感觉工作中用上的概率不大.但是如果平时不多积累并学透多线程,当工作中真的需要用到的时候,就很可能简单百度后把一些知识 ...

最新文章

  1. leetcode算法题--Restore IP Addresses
  2. access开发精要(3)-子数据表
  3. MFC和QT等UI框架的特点
  4. iar 连接linux开发板,LED裸机程序(IAR)
  5. SAP License:SAP不便解决的问题之九——客户退货维修
  6. 《Core Java 2》读书笔记(二)
  7. Matlab命令系列之目录操作
  8. NS版暗黑破坏神3金手指开发教程(1)
  9. 计算机考研408每日一题 day161
  10. 浅谈利用javascript实现gb2312编码。
  11. java高级软件工程师 考试_Java高级软件工程师人才缺口巨大
  12. 职场四种人:打工者、职业人、企业人和社会人,你是那种人?
  13. wxj项目的开发一点记录
  14. opencv入门Vec3f
  15. C语言——函数(下)
  16. SSH Tunneling (SSH隧道)远程连接服务器
  17. java 过滤字符串_java 过滤字符串方法实现
  18. jquery+css实现流星雨特效
  19. 图像显著性论文(六)—Saliency Filters Contrast Based Filtering for Salient Region Detection
  20. android输入过滤回车换行,Android实现输入框回车输入

热门文章

  1. KVM虚拟机转移到ESXI6.5
  2. 软件工程师与硬件工程师谁更有发展优势
  3. python用正则表达式判断字符串_使用Python验证常见的50个正则表达式
  4. 「揭秘GP」VLDB 创始人:为什么和其他相比,Greenplum 是最好的
  5. 计蒜客T1004输出Hello, World
  6. 为了生活佘家抛妻子一路向西
  7. 条码软件中如何在边框上添加文字
  8. 根据经纬度查询附近几公里的门店(5)代表5公里
  9. 网关协议——RIP(路由信息协议)
  10. norton诺顿symantec endpoint protection无密码卸载