iOS中关于KVC与KVO知识点

iOS中关于KVC与KVO知识点 

一、简介

KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding/NSKeyValueObserving非正式协议的形式被定义为基础框架的一部分。从协议的角度来说,KVC/KVO本质上是定义了一套让我们去遵守和实现的方法。
当然,KVC/KVO实现的根本是Objective-C的动态性和runtime,这在后文的原理部分会有详述。
另外,KVC/KVO机制离不开访问器方法的实现.

1、KVC简介

全称是Key-value coding,翻译成键值编码。顾名思义,在某种程度上跟map的关系匪浅。它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制。
2、KVO简介

全称是Key-value observing,翻译成键值观察。提供了一种当其它对象属性被修改的时候能通知当前对象的机制。再MVC大行其道的Cocoa中,KVO机制很适合实现model和controller类之间的通讯。

KVC定义了一种按名称访问对象属性的机制,支持这种访问的主要方法是:

- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

前边两个方法用到的Key较容易理解,就是要访问的属性名称对应的字符串。
后面两个方法用到的KeyPath是一个被点操作符隔开的用于访问对象的指定属性的字符串序列。比如KeyPath address.street将会访问消息接收对象所包含的address属性中包含的一个street属性。其实KeyPath说白了就是我们平时使用点操作访问某个对象的属性时所写的那个字符串。

如果要修改对象的属性值

1.一般情况下是直接利用对象属性的set方法来修改:

 Student *stu = [[Student alloc] init];
   // set方法的两种书写格式
[stu setAge:10];
stu.age = 10;

2.但是如果不知道对象类型呢?那么就可以运用KVC键值编码(Key Value Coding) 间接的修改对象属性

KVC实现方式是:使用字符串来描述对象需要修改的属性。

KVC的基本调用包括: valueForKey: 和 setValue:ForKey: 是以字符串的方式向对象发送消息

KVC一般用法:

/******************************** 创建Book.h文件只是为了说明forKeyPath的用法,不用实现 *********************************/
#import <Foundation/Foundation.h>
@interface Book : NSObject
@property (nonatomic,assign) double price; // 书的价格
@end /******************************** Student.h文件 *********************************/
#import <Foundation/Foundation.h> @class Book;
@interface Student : NSObject @property(nonatomic,assign) int age;     // 学生年龄
@property (nonatomic,copy) NSString *name; // 学生姓名
@property (nonatomic,retain) Book *book;   // 学生拥有书 // 测试方法
- (void)test;
@end /******************************** Student.m文件 *********************************/
#import "Student.h"
#import "Book.h"
@implementation Student - (void)test
{
Student *stu = [[Student alloc] init]; // 1.为基本数据类型单次赋值
[stu setValue:@"John" forKey:@"name"];
NSString *str = [stu valueForKey:@"name"]; // str = John // 2.为对象类型单次赋值
// setValue 要参数为id类型 因此要先将基本数据类型包装成对象类型
[stu setValue:@10 forKey:@"age"];
// 根据key值去取出对象后在转换成为基本数据类型
int age = [[stu valueForKey:@"age"] intValue]; // 10
NSLog(@"%@ %d",str,age); // John 10 // 3.批次的为基本数据类型和对象类型赋值
[stu setValuesForKeysWithDictionary:@{@"age":@20,@"name":@"Jim"}];
// 根据key取出所有的值存入字典
NSDictionary *dic = [stu dictionaryWithValuesForKeys:@[@"name",@"age"]];
NSLog(@"%@",dic); // age = 20;name = Jim // 4.间接的为Book对象的price属性赋值
stu.book = [[Book alloc] init]; // 创建stu.book对象
// 第一种方式:直接赋值
[stu.book setPrice:20.00]; // price = 20.00
// 第二种方式:通过键值来赋值
[stu.book setValue:@30.00 forKey:@"price"]; // price = 30.00
// 第三种方式:通过健路径来赋值
[stu setValue:@40 forKeyPath:@"book.price"]; // price = 40.00 // 键值和键路径就相当于文件名和文件路径名,那么键值路径是包含了键值的,因此可以使用键值的时候可以用键路径来代替 那么的第二种方式也可以写为
[stu.book setValue:@50 forKeyPath:@"price"]; // price = 50.00 NSLog(@"%.2f",stu.book.price); // 测试输出
}
@end 另外:KVC还提供了操作数组的方法和一些计算的参数

2.KVO (Key Value Observing) 键值观察机制,主要用来监听对象属性的变化

实现方式:添加监听器

举例:Teacher类要监听Student类中的name属性值的变化

/***************************** Student.h文件 *************************************/
#import <Foundation/Foundation.h> @interface Student : NSObject @property (nonatomic,copy) NSString *name; // 声明监听的属性 // 测试监听的方法
- (void)test;
@end
/***************************** Student.h文件 *************************************/
#import "Student.h"
#import "Teacher.h"
@implementation Student - (void)test
{
Student *stu = [[Student alloc] init]; // 利用KVC为name属性赋值
[stu setValue:@"章三" forKey:@"name"]; // 实现Teacher类监听Student属性name的变化 // 1.创建监听对象
Teacher *teacher = [[Teacher alloc] init]; // addOberver是NSObject分类方法 那么任何对象都可以添加监听方法 // 2.对student类添加监听对象teacher options参数:监听新值还是旧值
// forKeyPath:键路径 context:上下文用于动画中
[stu addObserver:teacher forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]; // 这里只监听了新值 当然也可以一起监听 option: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld // 修改了Student类name属性的值 就会通知监听器 Teacher对象 然后调用Teacher类中的
stu.name = @"李斯"; // 监听对象属性的值改变后 执行监听对象的方法 }
@end
/***************************** Teacher.h文件 *************************************/
#import <Foundation/Foundation.h>
@interface Teacher : NSObject
@end
/***************************** Teacher.m文件 *************************************/
#import "Teacher.h"
#import "Student.h"
@implementation Teacher // 一旦监听到Student类中name属性值发生变化就会调用监听器Teacher类中的这个方法 通过参数来说明
// keyPath = @"name"; object就是Student类 change:改变后传到的值是新值还是旧值 还是新旧值都有对应的是监听器中的option参数
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath:%@",keyPath); // keyPath:name
NSLog(@"objcet:%@",object); // object:Student
NSLog(@"change:%@",change); // \U674e\U65af 汉字被转义
}
@end
/***************************** mian.m文件 *************************************/
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool { // 测试
Student *stu = [[Student alloc] init];
[stu test];
}
return 0;
}

iOS中关于KVC与KVO知识点的更多相关文章

  1. Objective-C中的KVC与KVO(上)

    本文转载 李朴之先生博客 http://blog.csdn.net/pucker/article/details/7413280 Objective-C中的KVC与KVO是两种比较重要的技术,这里简要 ...

  2. iOS - 详细理解KVC与KVO

    详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...

  3. IOS开发之KVC与KVO简述

    KVC:Key-Value Coding KVO:Key-Value Observing Person.m #import <Foundation/Foundation.h> @inter ...

  4. iOS中 项目开发易错知识点总结

    点击return取消textView 的响应者 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [_contactTextFiled  ...

  5. iOS中 项目开发易错知识点总结 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 点击return取消textView 的响应者 - (BOOL)textFieldShouldReturn:(UI ...

  6. iOS 中通过kvc 获取数组的均值、求和、最大最小值等

    NSArray *values = @[@, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @]; NSNumber *avg = [values valu ...

  7. iOS开发中KVC、KVO简介

    在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...

  8. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

  9. [转] iOS (OC) 中 KVC 与 KVO 理解

    转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...

随机推荐

  1. 【知识分享】UIButton setTitle 设置为空 失效

    今天开发练习超级猜图,但是碰到了一个奇怪的问题 困扰我一个晚上,低效的夜晚 可恨~ 示例说明1 [button setTitle:@"" forState:UIControlSta ...

  2. (转)如何在高并发分布式系统中生成全局唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  3. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  4. TransparentBlt函数的使用注意事项

    今天客户需要在软件上需要添加一个自己公司的Logo,要求使用镂空透明的形式展现,本来以为很简单的工作没想到在MFC下这么复杂.Logo为BMP格式,白色背景. 以为和在按钮上显示控件差不多,先导入BI ...

  5. JAVA MemCache 史无前例的详细讲解【转】

    非原创转自:http://nhy520.iteye.com/blog/1775893 这篇文章是我看到的介绍的比较详细的,入门级别算是足足够了 Memcach什么是Memcache Memcache集 ...

  6. ASP.NET 发送电子邮件简介

    1.补充知识 (1)POP3和SMTP服务器是什么? 简单点来说:POP3 用于接收电子邮件 ,SMTP 用于发送电子邮件. (1)POP3具体指什么? POP3(Post Office Protoc ...

  7. [DevExpress]RepositoryItemComboBox 数据绑定

    关键代码: public static void Bind<T>(this RepositoryItemComboBox combox, ICollection source) { /*说 ...

  8. YII千万级PV架构经验分享--俯瞰篇--架构即产品

    hello,大家好,我是方少,今天想问大家一个问题,如果我们自己就是产品,那么我们怎样才能说服别人,我们是最优秀的呢?高学历,不错,别人成功过了.会php,java,c#,python不行再学c++, ...

  9. hosts文件的作用 whois查询域名信息

      Whois查询域名信息 在操作系统中的路径:Window98—在Windows目录下Windows 2000/XP—在C:\WINDOWS\system32\drivers\etc目录下 内容:包 ...

  10. Android UI学习前言:Android UI系统的知识结构

    Android UI系统的知识结构如下图所示: 对于 一个GUI系统地使用,首先是由应用程序来控制屏幕上元素的外观和行为,这在各个GUI系统中是不相同的,但是也具有相通性.Android系统在这方面, ...