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;
}
时间: 2024-11-05 20:42:26

IOS中关于KVC与KVO知识点的相关文章

iOS中的 观察者模式 之 KVO

1.KVO的简介 KVO 全称 Key-Value Observing.中文叫键值观察.KVO其实是一种观察者模式,观察者在键值改变时会得到通知,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器的视图组件就会被激发,激发时就会回调监听器自身.相比Notification,KVO更加的简单直接. KVO的操作方法由NSKeyValueCoding提供,而他是NSObject的类别,也就是说ObjC中几乎所有的对象都支持KVO操作.  KVO 需要实现实例变量的 s

OC 中的KVC和KVO

KVC: key value coding 键值编码. 可以将对象属性变为一个键从而去设置属性的值一.KVC的四种方法 1.setValue:forKey: 设置类属性的值如: [hunter setValue:"光头强" forKey:"name"]; 2.valueForKey: 取相对应的属性的值如: [person valueForKey:@"name"] 3.setValue:forKeyPath: 根据键路径设置类属性的值 4.val

M牛C原创博客——IOS中Quartz2D使用中的注意知识点

1> Quartz2D简介 什么是Quartz2D?二维的绘图引擎 什么是二维?平面 什么是引擎?经包装的函数库,方便开发者使用.也就是说苹果帮我们封装了一套绘图的函数库 同时支持iOS和Mac系统什么意思?用Quartz2D写的同一份代码,既可以运行在iphone上又可以运行在mac上,可以跨平台开发. 开发中比较常用的是截屏/裁剪/自定义UI控件. Quartz2D在iOS开发中的价值就是自定义UI控件. 图形上下文的数据类型和作用. 有多少种上下文. 自定义控件的步骤. 为什么要实现dra

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

每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 点击return取消textView 的响应者 - (BOOL)textFieldShouldReturn:(UITextField *)textField { [_contactTextFiled resignFirstResponder]; return YES; } - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRan

iOS 中使用 KVC 对 Json 的解析 &lt;一&gt;

APP端经常需要与服务器交互,json格式的数据是经常被使用的,解析json是经常要做的一件事. 先看一个示例,一般情况下,我们是这么解析的: // main.m // Demo #import <Foundation/Foundation.h> #import "Person.h" #import "Box.h" int main(int argc, const char * argv[]) { /** * { * "name":&

iOS开发中KVC、KVO简介

在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 Key Value Coding(键值编码),是OC 语言的一个特性,使用KVC,可以对对象的属性进行动态读写. KVC的操作方法由 NSKeyValueCoding协议提供,而NSObject已经实现了这个协议,因此OC中的几乎所有对象都可以使用KVC操作.常用的KVC操作方法有: (1)设置属性

Swift中KVC和KVO的使用

原创BLog,转载请注明出处 Swift中使用KVC和KVO的类都必须必须继承自NSObject KVC key-value coding 是一种间接访问对象的机制 key的值就是属性名称的字符串,返回的value是任意类型,需要自己转化为需要的类型 KVC主要就是两个方法 (1)通过key设置对应的属性 (2)通过key获取对应的属性 举例 class TestForKVC:NSObject{ var hwcCSDN = "hello world" } var instance =

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的关键技术之一. Demo: @interface myPerson : NSObject { NSString*_name; int      _age; int      _height; int      _w

【原】iOS中KVC和KVO的区别

在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间接访问实例变量的方法. KVC 提供了一个使用字符串(Key)而不是访问器方法,去访问一个对象实例变量的机制. 2> KVC部分源码(头文件) 1 // NSKeyValueCoding.h 2 @interface NSObject(NSKeyValueCoding) 3 4 + (BOOL)acce