kvc是用来方便的设置实例的属性值的,比如person类的实例p1有一个name的属性,那么我们可以通过kvc去设置p1的name,语法是:

[ 对象 setValue:@"xiaming" forKey:@"name"];其中xiaoming就是p1的name,这个就相当于用点语法给p1设置name:p1.name = @"xiaoming";

以上就是kvc的简单实用。接下来是kvo,kvo是键值观察,如果我想知道某个值,是否变化,变成什么,不可能一直去访问人家然后进行对比看有没有变化。在xcode中有一个方法用来方便的知道我们要观察的值是否变化,并在变化了之后触发响应的事件,具体操作如下:

假如我想知道某个累的name属性和age 属性是否变化,并在变化后触发响应的处理方法,就要先添加观察者:

 //    设置两个观察者观察name和age的值是否变化
[self addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:@"name"];
[self addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:@"age"];

以上代码添加了两个需要观察的值,分别是name和age,其中后面的context是我们后期使用kvo时用来区别究竟是name改变还是age改变才触发的kvo。添加了观察者之后,我们需要在程序运行的时候name和age 自动变化,那只好设置一个定时器喽:

声明定时器:

     NSTimer *timenow;

设置定时器的频率和触发的方法:(设置1.5s触发一次,触发haha:方法)

1     timenow = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(haha:) userInfo:nil repeats:YES];

设置完成后我们需要实现定时器中的haha:方法:

 //定时器方法
-(void)haha:(id)sender{ NSString *outString = [NSString stringWithFormat:@"current%d",arc4random()%];
self.name = outString;
self.age = outString;
}

在这个方法中我们随机给name和age赋值。

接下来就是设置键值观察:也就是当检测到我们观察的两个属性值改变时该如何处理:

 //设置键值观察,也就是观察值改变的时候所触发的方法。
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSString *contextString = [NSString stringWithFormat:@"%@",context];
if ([contextString isEqualToString:@"age"]) {
NSLog(@"ageobser%@",[change objectForKey:@"new"]);
}else{
NSLog(@"nameobser%@",[change objectForKey:@"new"]);//打印有变化的信息中的new值,也就是变化后的值
} // NSLog(@"%@",change);// 打印所有变化的相关信息 }

以上键值观察中通过if判断响应函数读入的context生成的字符串contextString去判断是由哪个所观察的键值改变后触发的kvo,然后根据情况进行处理,如果观察的键值多的话可以用switch case语句进行判断执行。还有另一种方法去判断是哪个观察者触发的:

 if ([keyPath isEqualToString:@"name"]) {
NSLog(@"nameobser%@",[change objectForKey:@"new"]);
}else{
NSLog(@"ageobser%@",[change objectForKey:@"new"]);
}

也就是通过Keypath去判断。因为我们在添加观察者的时候已经设定了不同的keypath有不同的字符串属性。

释放观察者:

 //移除观察者
-(void)dealloc{
[self removeObserver:self forKeyPath:@"name"];
[self removeObserver:self forKeyPath:@"age"];
}

执行结果为;

 -- ::39.057 FirstLessonOfUI[:] nameobsercurrent84
-- ::39.058 FirstLessonOfUI[:] ageobsercurrent84
-- ::40.558 FirstLessonOfUI[:] nameobsercurrent36
-- ::40.558 FirstLessonOfUI[:] ageobsercurrent36
-- ::42.058 FirstLessonOfUI[:] nameobsercurrent51
-- ::42.059 FirstLessonOfUI[:] ageobsercurrent51
-- ::43.557 FirstLessonOfUI[:] nameobsercurrent99
-- ::43.558 FirstLessonOfUI[:] ageobsercurrent99
-- ::45.058 FirstLessonOfUI[:] nameobsercurrent99
-- ::45.058 FirstLessonOfUI[:] ageobsercurrent99

IOS开发-OC学习-kvc,kvo的更多相关文章

  1. iOS开发笔试面试- KVC/KVO简单使用

    转自:http://my.oschina.net/caijunrong/blog/510701 一.对于KVC模式(Key Value Coding): 1.其实在实际开发中用得比较多得就是:接收到j ...

  2. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  3. iOS开发-OC语言 (一)oc数据类型

    分享一套以前学习iOS开发时学习整理的资料,后面整套持续更新: oc数据类型 数据类型:基本数据类型.指针数据类型 基本数据类型:数值型.字符型(char).布尔型.空类型(void) 指针数据类型: ...

  4. iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

    在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握 ...

  5. iOS开发如何学习前端(2)

    iOS开发如何学习前端(2) 上一篇成果如下. 实现的效果如下. 实现了一个横放的<ul>,也既iOS中的UITableView. 实现了当鼠标移动到列表中的某一个<li>,也 ...

  6. iOS开发如何学习前端(1)

    iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...

  7. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  8. iOS开发——OC篇&消息传递机制(KVO/NOtification/Block/代理/Target-Action)

     iOS开发中消息传递机制(KVO/NOtification/Block/代理/Target-Action)   今晚看到了一篇好的文章,所以就搬过来了,方便自己以后学习 虽然这一期的主题是关于Fou ...

  9. IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路

    在不知不觉当中已经写了21篇内容 其实一开始是没有想些什么东西的 只是买了Air后 感觉用着挺舒服的,每天可以躺在床上,就一台笔记本,不用网线,不用电源,不用鼠标,不用键盘,干干脆脆的就一台笔记本. ...

  10. IOS开发---菜鸟学习之路--(一)

    PS(废话): 看了那么多的博客文章,发现大部分人都一直在强调写技术博客的重要性,索性自己也耐着性子写写看吧. 写博客的重要性之类的说明,我就不做复制黏贴的工作了.因为自己没有写过多少,所也不清楚是不 ...

随机推荐

  1. Android中在布局中写ViewPager无法渲染出来的问题

    今天刚刚使用Android Studio,在写ViewPager时,首先按F4把Dependencies添加一个V4包,然后写ViewPager,如下: <android.support.v4. ...

  2. List<Map>去重排序

    数据格式 [ { "id":"d3e8a9d6-e4c6-4dd8-a94f-07733d3c1b59", "parentId":" ...

  3. maven 教程一 入门

    摘要: (1)maven是项目管理工具,类似makefile.主要的生命阶段有 validate:验证工程是否正确,所有需要的资源是否可用.  compile:编译项目的源代码.    test:使用 ...

  4. STM32软件复位(基于库文件V3.5)

    源:STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(); // 关闭所有中端 NVIC_SystemReset();// 复位 ...

  5. SQL Server 2008登录问题(错误 233和18456)解决方法

    今天使用 SQLSERVER2008 先遇到了233 错误,后又遇到了 18456 ,从网上找到了解决方法,具体如下: 问题一 : 已成功与服务器建立连接,但是在登录过程中发生错取.(provider ...

  6. FACE++学习一、detect接口

    /detection/detect 描述 检测给定图片(Image)中的所有人脸(Face)的位置和相应的面部属性 目前面部属性包括性别(gender), 年龄(age), 种族(race), 微笑程 ...

  7. Python 函数简介之一

    面向对象--->对象------>Class 面向过程--->过程------>def 函数式编程--->函数---->def 函数的介绍: def fun1(): ...

  8. POJ 2991 Crane

    线段树+计算几何,区间更新,区间求和,向量旋转. /* *********************************************** Author :Zhou Zhentao Ema ...

  9. Qt5:Qt文件操作类 QFile

    在QT中,操作文件一般不使用C++提供的文件操作类 , 因为操作文件的时候,要用到C++提供的 string 类,而在QT中使用的是Qt自己实现的一个string类 QString .在Qt中使用C+ ...

  10. 基于Nginx的Rtmp流媒体服务器环境搭建

    一.编译安装 wget http://nginx.org/download/nginx-1.4.2.tar.gz wget https://github.com/arut/nginx-rtmp-mod ...