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与路由器连接服务

    界面UI: package my.work.Library; import java.util.Timer; import java.util.TimerTask; import java.util. ...

  2. LightOJ 1341 Aladdin and the Flying Carpet(整数拆分定理)

    分析:题目并不难理解,就是一些细节上的优化需要我们注意,我在没有优化前跑了2000多MS,优化了一些细节后就是400多MS了,之前还TLE了好几次. 方法:将整数拆分为质因子以后,表达为这样的形式,e ...

  3. Git学习 -- 冲突解决

    当连个分支对统一文件提交了不同修改时,可能会出现冲突,例如: $ git merge feature1 Auto-merging readme.txt CONFLICT (content): Merg ...

  4. PAT1003

    As an emergency rescue team leader of a city, you are given a special map of your country. 作为一个城市的紧急 ...

  5. hdu_2844_Coins(多重背包)

    题目连接:hdu_2844_Coins 题意:给你n个硬币的价值和对应的数量,问你从1到m有那些数能组合出来 题解:如果我们将硬币的价值看成一个物品的容量和价值,那么对应1-m,如果dp[i]==i, ...

  6. 使用Emmet加速Web前端开发

    Emmet插件以前被称作为Zen Coding,是一个文本编辑器的插件,它可以帮助您快速编写HTML和CSS代码,从而加速Web前端开发.早在2009年,Sergey Chikuyonok写过一篇文章 ...

  7. 在web项目中使用cxf开发webservice,包含spring支持

    本文主要介绍了,如何使用cxf内置的例子,学会开发webserivce,在web项目中使用,且包含spring支持. webserivce的开发可以使用cxf或者axis,好像还有httpclient ...

  8. GridView 编辑,更新,删除 等操作~~

    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { GridView1. ...

  9. Ubuntu下安装Hudson

    因为hudson需要依赖java等,手动安装比较费劲 官方给出了一种很简单的解决方案:http://wiki.eclipse.org/Hudson-ci/Installing_Hudson_DEB 1 ...

  10. Python3基础 Python的函数都有返回值 无指定返回值的函数 返回NONE对象

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...