iOS-KVC和KVO精炼讲解(干货)
一、KVO介绍
KVO就是观察者模式,说白了就是你关心的一个值改变了,你就会得到通知。你就可以在你想处理的地方处理这个值。
二、KVO的使用
一般分为三步:
- 注册监听
使用方法:
/**
* 添加KVO监听者
*
* @param observer 观察者(监听器)
* @param keyPath 属性名(要观察的属性)
* @param options
* @param context 传递的参数
*/
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
例子:
//为对象p添加一个观察者(监听器)
[p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:@"test"];
2.设置监听事件
/**
* 当利用KVO监听到某个对象的属性值发生了改变,就会自动调用这个
*
* @param keyPath 哪个属性被改了
* @param object 哪个对象的属性被改了
* @param change 改成咋样
* @param context 当初addObserver时的context参数值
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@ %@ %@ %@", object, keyPath, change, context);
}
3.取消监听
//释放KVO监听
-(void)dealloc
{
[p removeObserver:self forKeyPath:@"test"];
}
iOS 中KVC的总结
一、 KVC介绍
kvc就是键值编码(key-value),说白了就是通过指定的key获得想要的值value。而不是通过调用Setter、Getter方法访问。*
二、 KVC的强大之处
1 .访问私有变量
一个类中的私有变量,不能直接通过Setter、Getter方法访问。但是却可以通过KVC来访问。举例:
一个类如下:
@interface Dog : NSObject
{
@private
double height;
}
这里的私有变量 height ,假如直接使用Setter、Getter方法访问,就会出现下面的错误。
这时候可以使用KVC来访问这个私有变量:
Dog *dog = [[Dog alloc]init];
[dog setValue:@12 forKey:@"height"];//给私有变量赋值
NSLog(@"dog's height is = %@",[dog valueForKey:@"height"]);//读取私有变量的值
- 实际使用举例
利用kvc的这个特性,我们可以访问系统里的一些私有变量。
例如:在UIPageControl里面有两个私有变量:
UIImage* _currentPageImage;
UIImage* _pageImage;
我们可以通过kvc来进行读取和赋值:
UIPageControl *pageControl = [[UIPageControl alloc]init];
//设置值
[pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_currentPageImage"];
[pageControl setValue:[UIImage imageNamed:@"XX"] forKeyPath:@"_pageImage"];
//读取值
UIImage *currentImage = [pageControl valueForKey:@"_currentPageImage"];
UIImage *pageImage = [pageControl valueForKey:@"_pageImage"];
这样我们就可以设置当前显示和未显示到脚标的样式了。
2. 使用KVC直接访问 NSArray 或者 NSSet 的属性值
NSArray/NSSet等都支持KVC,这里举一个例子:
NSArray *books= @[book1, book2, book3];
NSArray *names = [books valueForKeyPath:@"name"];
NSLog(@"%@", [books valueForKeyPath:@"@avg.price"]);//使用kvc直接打印出来书的平均价格
其中,book是一个书类,有一个属性是name,一个属性是price。
3. 使用KVC将字典(json)转化成模型
// 定义一个字典
NSDictionary *dict = @{
@"name" : @"jack",
@"money" : @"20.7",
};
// 创建模型
Person *p = [[Person alloc] init];
// 字典转模型
[p setValuesForKeysWithDictionary:dict];
NSLog(@"person's name is the %@",p.name);
}
注意:
(1). key的值必须正确,如果拼写错误,会出现异常
(2). 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来
(3). 因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去
(4). NSArray/NSSet等都支持KVC
iOS-KVC和KVO精炼讲解(干货)的更多相关文章
- iOS:KVC和KVO
来源: 对月流 链接:http://www.jianshu.com/p/f1393d10109d 写在前面: 关于KVC和KVO各种博客多了去了,重新整理下,就当是温习一下吧,也还算是个新手,不对的 ...
- iOS KVC 和 KVO 的学习
KVC (NSKey Value Coding) :键值编码 KVO (Key Value Observing) :键值监听 前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种 ...
- [iOS] KVC 和 KVO
开发iOS经常会看见KVO和KVC这两个概念,特地了解了一下. 我的新博客wossoneri.com link KVC Key Value Coding KVC是一种用间接方式访问类的属性的机制.比如 ...
- iOS KVC 和 KVO 区别简单总结
KVC: key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实 ...
- iOS KVC详细讲解
iOS KVC详细讲解 什么是KVC? KVC即NSKeyValueCoding,就是键-值编码的意思.一个非正式的 Protocol,是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取 ...
- iOS编程——Objective-C KVO/KVC机制[转]
这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1. 1 ...
- iOS编程——Objective-C KVO/KVC机制
来源:http://blog.sina.com.cn/s/blog_b0c59541010151s0.html 这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结 ...
- 【原】iOS中KVC和KVO的区别
在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...
- iOS中关于KVC与KVO知识点
iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点 一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...
随机推荐
- 使用SurfaceView和MediaPlayer实现视频做为背景
场景:像我们在Uber应用开场,看到一一段视频作为開始.这样子让用户非常快投入应用使用的场景中去,这样的以视频作为开场的应用,我们是不是认为非常高大上呢,哈哈,事实上是使用了SerfaceView去载 ...
- FullScreenDownloader
https://github.com/Gitdefllo/FullScreenDownloader
- pylons使用多个数据库(multiple DB)
最近做的工程要修改成两个数据库的,一个测试数据库, 一个线上数据库. 所以就要把原来的只有一个数据库的改成两个数据库. 第一步:修改development.ini # SQLAlchemy datab ...
- 配置apache虚拟主机的实例总结
如何实现apache虚拟主机配置. 1.基于ip地址的虚拟主机Listen 80<VirtualHost 172.20.30.40> DocumentRoot /home/httpd/ht ...
- 解决ajax.net 1.0中文乱码问题!
在使用ajax.net的UpdatePanel的时候,当requestEncoding编码为GB2312的时候,出现乱码.如果要解决这个问题最简单的就是改用utf-8了,但是原来使用GB2312, ...
- Ubantu下FTP服务器资源进行控制
在FTP服务器的管理中无论对本地用户还是匿名用户,对于FTP服务器资源的使用都需要进行控控制, 避免由于负担过大造成FTP服务器运行异常, 可以添加以下配置项对FTP客户机使用FTP服务器资源进行控制 ...
- ubuntu13.04装配oracle11gR2
http://jingyan.baidu.com/album/bea41d435bc695b4c41be648.html?picindex=2 http://www.360doc.com/conten ...
- HTTP Referer二三事---转
授权方式:署名,非商业用途,保持一致,转载时请务必以超链接(http://www.fwolf.com/blog/post/320)的形式标明文章原始出处和作者信息及本声明. 什么是HTTP Refer ...
- 关于解决[INSTALL_FAILED_UPDATE_INCOMPATIBLE]
通过adb install安装apk,报错Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]. 说明没有正常卸载原apk,基本都是直接通过rm XXX.apk所造 ...
- Android设置窗口、控件透明度
设置透明效果的方法如下: 1.在布局文中设置透明效果 android:background="@android:color/transparent" (通过android自带颜色设 ...