OC_KVC与KVO简单介绍
KVC
KVC概述
KVC
即 Key-value coding
键值编码,是指iOS的开发中,可以允许开发者通过Key
名直接访问对象的属性,或者给对象的属性赋值。
KVC案例
@interface Person : NSObject@property (nonatomic,assign) int age;
@property (nonatomic,copy) NSString *name;@end
复制代码
如以上代码,我们创建了一个 Person
类,他有两个属性,分别是 age
和 name
。 然后我们将其实例化,并且赋予其姓名和年龄属性:
Person *p1 =[Person new];
p1.name = @"Kobe";
p1.age = 30;
复制代码
这是常规的赋值方式,那么KVC是如何赋值的呢?
[p1 setValue:@"Kobe" forKey:@"name"];
[p1 setValue:@"38" forKey:@"age"];
复制代码
如以上代码,通过KVC,我们可以直接使用键值对的方式对对象的属性进行赋值。
同理,获取属性也可以使用键值对的方式:
[p1 valueForKey: @"name"];
[p1 valueForKey:@"age"];
复制代码
这样即可获取对象的 name
和 age
属性。
那么给我们再设置一个 Dog
类
@interface Dog : NSObject
@property (nonatomic,copy) NSString *name;
@end
复制代码
给 Person
类增加一个 Dog
属性
@property (nonatomic,strong) Dog *dog;
复制代码
实例化 Dog
对象并初始化,然后赋值给 Person
对象
Dog *dog1 = [Dog new];
dog1.name = @"旺财";
p1.dog = dog1;
复制代码
那么如何使用KVC给获取 p1
的 dog
的 name
属性呢? 只需要嵌套一层:
// 获取
[[p1 valueForKey:@"dog"] valueForKey:@"name"];
// 设置
[[p1 valueForKey:@"dog"] setValue:@"狗狗" forKey:@"name"];
复制代码
还有一种简洁的方法就是使用以下方法
// 设置
[p1 setValue:@"狗狗" forKeyPath:@"dog.name"];
// 获取
[p1 valueForKeyPath:@"dog.name"];
复制代码
直接使用 "." 连接属性即可。
KVO
KVO 即 Key-Value Observing
是基于 KVC 的一种观察者模式,它可以通过 KVC 的方式对对象的属性观测,当 keyPath
的值变化时会发出通知。
KVO的实现方法
KVO的实现是以下三个步骤:
- 向通知中心注册观察
- 在某一时刻
keyPath
的值变化,通知中心向观察者发送消息,调用方法。 - 重写
dealloc
方法,注销观察。
KVO的案例
首先我们先创建一个类用于数值变化,这里就叫 KVOItem
类,给它添加一个 int
类型属性 number
。
@interface KVOItem : NSObject
@property (nonatomic,assign) int number;
@end
复制代码
然后创建并初始化对象,并为其添加观察:
item = [KVOItem new];
item.number = 0;
[item addObserver:self forKeyPath:@"number" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:@"KVOTEST"];
复制代码
这里观察 item
中 key
值为 number
的属性。 注册观察后,需要实现观察所调用的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{if (context == @"KVOTEST") {NSLog(@"change from %@ to %@",[change valueForKey:@"old"],[change valueForKey:@"new"]);}
}
复制代码
然后我们使用一个 NSTimer
来重复更改 item
的 number
属性。
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:3 repeats:YES block:^(NSTimer *timer){item.number++;}];[timer fire];
复制代码
并且不要忘了在 dealloc
方法中注销观察:
-(void)dealloc{[item removeObserver:self forKeyPath:@"KVOTEST"];
}
复制代码
运行后我们可以看到在控制台打印以下消息:
change from 0 to 1
change from 1 to 2
change from 2 to 3
change from 3 to 4
复制代码
OC_KVC与KVO简单介绍相关推荐
- 遗传算法的简单介绍以及模式定理的简单证明
遗传算法 遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...
- 2021年大数据ELK(十八):Beats 简单介绍和FileBeat工作原理
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Beats 简单介绍和FileBeat工作原理 一.Beats 二.FileB ...
- 2021年大数据ELK(十五):Elasticsearch SQL简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 Elasticsearch SQL简单介绍 一.SQL与Elasticsear ...
- 2021年大数据ELK(二):Elasticsearch简单介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.Elasticsearch简介 1.介绍 2.创始人 二.E ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇-多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
- 简单介绍一下R中的几种统计分布及常用模型
统计学上分布有很多,在R中基本都有描述.因能力有限,我们就挑选几个常用的.比较重要的简单介绍一下每种分布的定义,公式,以及在R中的展示. 统计分布每一种分布有四个函数:d――density(密度函数) ...
- LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍
LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍 LVS (Linux Virtual Server) LVS(Linux Virtual Server)其实就是 ...
- dubbo学习过程、使用经验分享及实现原理简单介绍
一.前言 部门去年年中开始各种改造,第一步是模块服务化,这边初选dubbo试用在一些非重要模块上,慢慢引入到一些稍微重要的功能上,半年时间,学习过程及线上使用遇到的些问题在此总结下. 整理这篇文章差不 ...
- iOS开发UI篇—UIWindow简单介绍
iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...
最新文章
- 全球及中国素食宠物食品行业产销需求与销售渠道咨询报告2022版
- [Noi2014]随机数生成器
- WCF服务自托管(Self-Hosting)
- P7115-[NOIP2020]移球游戏【构造】
- AngularJs入门学习
- Go -- log4go日志
- mysql 无符号 负数_mysql – BETWEEN使用负值和无符号整数
- asp.net处理机制管道事件
- Java泛型原理、类型擦除
- 使用python玩转dicom文件——医学图像处理工具pydicom入门教程
- Android 如何直播RTMP流
- 2021ACA世界大赛中国赛区完美收官,创意设计收获百万级关注
- Mybatis-入门程序(二)
- 巴比特 | 元宇宙每日必读:用户流失,滞销频现,平台在合规和利润面前该如何平衡?...
- Bayesian Learning via Stochastic Gradient Langevin Dynamics
- 一些常用的英文写作网站
- Evaluate之迷思
- Kali Linux入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。
- axios中的拦截器
- 最新2009年度长篇经典小说推荐列表
热门文章
- clickhouse hadoop_大数据分析之解决Hadoop的短板,实时大数据分析引擎ClickHouse解析...
- api有哪些 javasocket_socket及socket java api
- linux下centos安装mysql数据库_Linux CentOS 下的MySQL数据库安装与配置-阿里云开发者社区...
- 误差error,偏置bias,方差variance的见解
- iOS手势操作简介(六)
- 质量属性六个常见属性场景(《淘宝网》为例) 15
- 【计算机算法设计与分析】——排序
- HNOI2018游记
- union 和 union all 有什么不同?
- Sql 行转列问题总结