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. HDU 4685 Prince and Princess(二分匹配+强联通分量)

    题意:婚配问题,但是题目并不要求输出最大匹配值,而是让我们输出,一个王子可以与哪些王妃婚配而不影响最大匹配值. 解决办法:先求一次最大匹配,如果有两个已经匹配的王妃,喜欢她们两个的有两个或者以上相同的 ...

  2. FZU 1912 Divisibility by Thirty-six(整除问题+字符串维护+贪心)

    这个整除36的与整除45的完全一样,就是被4整除的有点多,但都是两位数,所以枚举后面两位就可以了. #include <stdio.h> #include <string.h> ...

  3. 转:设置HtmlUnitDriver代理及处理用户验证有关问题

    selenium2 提供了一种无ui模式的driver,即htmlunitdriver.特点运行比较快.其实htmlunitdriver 是对htmlunit 的封装,这样大家就可以使用自己习惯sel ...

  4. web.xml中常用元素的解读

    前言 针对一个项目而言,通常会有几类XML文件需要书写. web.xml spring-context.xml spring-mvc.xml other.xml ... 不管有多少配置文件,可以肯定的 ...

  5. 为什么MVC不是一种设计模式? ---比较Backbone和Ext4.x在MVC实现上的差异

    为什么MVC不是一种设计模式? ---比较Backbone和Ext4.x在MVC实现上的差异 大漠穷秋 前言 圣人云:不想做妈咪的小姐不是好码农. 每一个码农的心中都有一个终极理想,那就是有一天不用再 ...

  6. iOS7以后的侧滑返回上一页

    我们知道,iOS7以后,导航控制器默认带了侧滑返回功能,但是仅限于屏幕边缘.而且在你自定义leftBarButtonItem等之后侧滑效果就会消失.这种问题怎么解决呢? 首先,我们先来看看系统的这种手 ...

  7. void (*isr_handle_array[50])(void);求解这个申明怎么理解 啊??

    这是函数指针数组.一层一层向里面剥就好啦. 是一个指向 返回值为void 参数也是void的指针数组.先看里面[50]知道是个数组,再向外看是一个函数指针,合起来就是函数指针数组.我写个源码,你就明白 ...

  8. HDU 1754 I Hate It(线段树基础应用)

    基础线段树 #include<iostream> #include<cstdio> #include<cstring> using namespace std; # ...

  9. linux查看系统的硬件信息

    linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并做了分类,实例解说. cpu lscpu命令,查看的是cpu的统计信息. blue@blue-pc:~ ...

  10. 【knockoutjs】 Computed VS Pure Computed 区别

    Pure Computed只有当有其他subscriber的时候才会有这个对象,所对应的DOM对象 不激活的时候不存在,这样可以防止内存泄露,在Component等场景下不用担心dispose的问题. ...