目  录:
一、KVC  
二、KVO                                                                                                                                                                                              
一、KVC机制                                                                                                                                                            
  1、KVC简述
  KVC是KeyValueCoding(键值对的编码)的简称,它是一种可以直接通过字符串的名字(key)来访问类属性(实例变量)的机制。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。
  2,使用方法
  关键方法定义在:NSKeyValueCodingprotocol。
  KVC支持类对象和内建基本数据类型。
  KVC的常用方法:
    - (id)valueForKey:(NSString *)key;//获取
    -(void)setValue:(id)value forKey:(NSString *)key;//设置
  valueForKey的方法根据key的值读取对象的属性,setValue:forKey:是根据key的值来写对象的属性。
  例如:
    [person setValue:@“Tom” forKey:@“name”];
    NSString *name = [person valueForKey:@“name”];
#import <Foundation/Foundation.h>

@interface Person : NSObject
{
NSString *_name;
NSInteger _age;
Person *_wife;
}
@end
#import "ViewController.h"
#import "Person.h"
@interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//创建对象
Person *person = [[Person alloc]init];
//使用KVC来存储对象的数据成员
[person setValue:@"Tom" forKey:@"_name"];
[person setValue:@ forKey:@"_age"];
NSLog(@"person:%@",person);
//取对象的数据成员
NSString *name = [person valueForKey:@"_name"];
NSInteger age = [[person valueForKey:@"_age"]integerValue];
NSLog(@"KVC方式存取:name:%@,age:%ld",name,age); }
@end

  如果需要打印输出对象,还需要重写Person类的descaprition方法。

#import "Person.h"

@implementation Person
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
}
@end

  3、扩展KVC的使用

Book类的.h文件

#import <Foundation/Foundation.h>

@interface Book : NSObject
@property(copy,nonatomic)NSString *bookName; @end Book类的.m文件
#import "Book.h" @implementation Book
-(NSString *)description
{
return [NSString stringWithFormat:@"%@",_bookName];
}
@end
Person类的.h文件

#import <Foundation/Foundation.h>
@class Book;
@interface Person : NSObject
@property(copy,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@property(strong,nonatomic)Book *book;
@end Person类的.m文件
#import "Person.h" @implementation Person
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
}
@end

  最后是实现文件。

#import "ViewController.h"
#import "Book.h"
#import "Person.h"
@interface ViewController () @end
@implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
Person *p1 = [[Person alloc]init];
[p1 setValue:@"Tom" forKey:@"name"];
[p1 setValue:@ forKey:@"age"];
Book *book1 = [[Book alloc]init];
book1.bookName = @"iPhone";
p1.book = book1; Person *p2 = [[Person alloc]init];
[p2 setValue:@"Jerry" forKey:@"name"];
[p2 setValue:@ forKey:@"age"];
Book *book2 = [[Book alloc]init];
book2.bookName = @"iOS";
p2.book = book2; NSLog(@"%@%@",p1,[p2 valueForKeyPath:@"name"]); NSArray *person = @[p1,p2];
NSLog(@"%@",person); NSArray *arrayM = [person valueForKeyPath:@"book.bookName"];
NSLog(@"%@",arrayM);
} @end
 
二、KVO机制                                                                                                                                                                                                
  1、KVO简述
  KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
  2、使用方法
  系统框架已经支持KVO,所以程序员在使用的时候非常简单。使用步骤:
   (1)注册需要观察的对象的属性addObserver:forKeyPath:options:context:
   (2)实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
   (3)取消注册观察removeObserver:forKeyPath:context:
#import <Foundation/Foundation.h>

@interface Person : NSObject
{
NSString *_name;
}
@end
#import "Person.h"

@implementation Person
//接受被观察者发生变动后的通知
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@,%@,%@,%@",keyPath,object,change,context);
}
@end

  再添加一个股票类,让Person作为观察者,对股票的价格进行监听。

#import <Foundation/Foundation.h>

@interface Stock : NSObject
{
NSString *_name;
float _price;
}
@end

  实现文件内容:

#import "ViewController.h"
#import "Person.h"
#import "Stock.h"
@interface ViewController ()
@property(strong,nonatomic)Person *person;
@property(strong,nonatomic)Stock *stock;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//创建观察者
self.person = [[Person alloc]init];
[self.person setValue:@"Tom" forKey:@"_name"]; //创建股票
self.stock = [[Stock alloc]init];
[self.stock setValue:@"sxt" forKey:@"_name"];
[self.stock setValue:@1.2 forKey:@"_price"]; //设置观察者
[self.stock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"add"];
}
//单击按钮让股票价格加1
- (IBAction)buttonClicked:(UIButton *)sender
{
float price = [[self.stock valueForKey:@"_price"]floatValue];
[self.stock setValue:@(price+1.0) forKey:@"_price"];
} -(void)dealloc
{
//删除观察者
[self.stock removeObserver:self.person forKeyPath:@"_price"];
}
@end

iOS_KVC与KVO的更多相关文章

  1. iOS---观察者模式之--->KVO

    文章结构如下: Why? (为什么要用KVO) What? (KVO是什么) How? ( KVO怎么用) More (更多细节) 原理 自己实现KVO 在我的上一篇文章浅谈 iOS Notifica ...

  2. Objective-C之KVC、KVO

    1,KVC(键值编码)  Key Value Coding 1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进 ...

  3. OS 如何选择delegate、notification、KVO?

    原文链接:http://blog.csdn.net/dqjyong/article/details/7685933 前面分别讲了delegate.notification和KVO的实现原理,以及实际使 ...

  4. KVC 和 KVO

    KVC 键值编码    全称是Key-value coding,翻译成键值编码.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制.        1.通过key(成员变量的名称)设置 ...

  5. 11. KVC And KVO

    1. KVC And KVO  的认识 KVC/KVO是观察者模式的一种实现  KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...

  6. KVO __ 浅谈

    KVO :Key-Value Observing 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了. ...

  7. iOS开发系列--Objective-C之KVC、KVO

    概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听( ...

  8. delegate、notification、KVO场景差别

    delegate: 编译器会给出没有实现代理方法的警告 一对一 使用weak而不是assign,或者vc消失时置为nil 可以传递参数,还可以接收返回值 notification: 编译期无法排错 一 ...

  9. IOS学习之初识KVO

    什么是KVO? KVO(Key-Value Observing)键值观察,是一种通过对对象的某一个属性添加观察者,一旦这个属性值发生变化,就会通知当前观察者的一种机制. 该如何使用? 1.注册,指定被 ...

随机推荐

  1. spark hive结合杂记(hive-site.xml)

    1.下载spark源码,在spark源码目录下面有个make-distribution.sh文件,修改里面的参数,使编译后能支持hive,修改后执行该文件.(要预先安装好maven才能编译). 2.将 ...

  2. js yield

    meikidd 发布在meikidd2015年5月6日view:3397 在文章任何区域双击击即可给文章添加[评注]!浮到评注点上可以查看详情. 隐藏标注 首先请原谅我的标题党(●—●),tj 大神的 ...

  3. android JNI常用添加log方法

    android JNI 打log方法 添加库支持 LOCAL_LDLIBS :=-llog -landroid 包含头文件 #include <android/log.h> #define ...

  4. C++11写算法之二分查找

    同样的,二分查找很好理解,不多做解释,要注意二分查找的list必须是排好序的. 这里实现了两种二分查找的算法,一种递归一种非递归,看看代码应该差不多是秒懂.想试验两种算法,改变一下findFunc函数 ...

  5. 如何学习TP框架

    1.学习访问方法 2.控制器的写法 3.视图的写法 4.模型的写法 5.扩展类的用法 6.扩展插件的用法

  6. Linux基础分析

    1.系统目录 [root@15b883 ~]# tree -L 1 / ├── bin 常用二进制命令所在的目录 ├── boot 内核及系统引导程序所在的文件目录 ├── dev 设备目录 ├── ...

  7. UTI iPhone支持依文件后缀名打开应用

    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6658492 iphoneapplicationprocessingfileurl ...

  8. scaffolding —— 脚手架(转)

    Scaffolding — 基架 基于数据库架构生成网页模板的过程.在 ASP .NET 中,动态数据使用基架来简化基于 Web 的 UI 的生成过程.用户可以通过这种 UI 来查看和更新数据库.   ...

  9. Instapaper 使用经验和技巧

    Instapaper 分类本质是文件夹整理,没有标签. 文件夹意味着一篇文章只能放在一个文件夹里,不像标签可以实现一篇文章多个标签的功能. 一.文件夹和Like功能 1.已有文件夹: Home:存放所 ...

  10. 实用的 集合工具类 和 String工具类

    集合工具类:CollectionUtil method: 1.isNotEmpty() 不为空 2.isEmpty() 为空 举例:map集合         Map<String,String ...