目  录:
一、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”];
  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Person : NSObject
  4. {
  5. NSString *_name;
  6. NSInteger _age;
  7. Person *_wife;
  8. }
  9. @end
  1. #import "ViewController.h"
  2. #import "Person.h"
  3. @interface ViewController ()
  4.  
  5. @end
  6.  
  7. @implementation ViewController
  8.  
  9. - (void)viewDidLoad {
  10. [super viewDidLoad];
  11. //创建对象
  12. Person *person = [[Person alloc]init];
  13. //使用KVC来存储对象的数据成员
  14. [person setValue:@"Tom" forKey:@"_name"];
  15. [person setValue:@ forKey:@"_age"];
  16. NSLog(@"person:%@",person);
  17. //取对象的数据成员
  18. NSString *name = [person valueForKey:@"_name"];
  19. NSInteger age = [[person valueForKey:@"_age"]integerValue];
  20. NSLog(@"KVC方式存取:name:%@,age:%ld",name,age);
  21.  
  22. }
  23. @end

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

  1. #import "Person.h"
  2.  
  3. @implementation Person
  4. -(NSString *)description
  5. {
  6. return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
  7. }
  8. @end

  3、扩展KVC的使用

  1. Book类的.h文件
  2.  
  3. #import <Foundation/Foundation.h>
  4.  
  5. @interface Book : NSObject
  6. @property(copy,nonatomic)NSString *bookName;
  7.  
  8. @end
  9.  
  10. Book类的.m文件
  11. #import "Book.h"
  12.  
  13. @implementation Book
  14. -(NSString *)description
  15. {
  16. return [NSString stringWithFormat:@"%@",_bookName];
  17. }
  18. @end
  1. Person类的.h文件
  2.  
  3. #import <Foundation/Foundation.h>
  4. @class Book;
  5. @interface Person : NSObject
  6. @property(copy,nonatomic)NSString *name;
  7. @property(assign,nonatomic)NSInteger age;
  8. @property(strong,nonatomic)Book *book;
  9. @end
  10.  
  11. Person类的.m文件
  12. #import "Person.h"
  13.  
  14. @implementation Person
  15. -(NSString *)description
  16. {
  17. return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
  18. }
  19. @end

  最后是实现文件。

  1. #import "ViewController.h"
  2. #import "Book.h"
  3. #import "Person.h"
  4. @interface ViewController ()
  5.  
  6. @end
  7. @implementation ViewController
  8.  
  9. - (void)viewDidLoad {
  10. [super viewDidLoad];
  11. Person *p1 = [[Person alloc]init];
  12. [p1 setValue:@"Tom" forKey:@"name"];
  13. [p1 setValue:@ forKey:@"age"];
  14. Book *book1 = [[Book alloc]init];
  15. book1.bookName = @"iPhone";
  16. p1.book = book1;
  17.  
  18. Person *p2 = [[Person alloc]init];
  19. [p2 setValue:@"Jerry" forKey:@"name"];
  20. [p2 setValue:@ forKey:@"age"];
  21. Book *book2 = [[Book alloc]init];
  22. book2.bookName = @"iOS";
  23. p2.book = book2;
  24.  
  25. NSLog(@"%@%@",p1,[p2 valueForKeyPath:@"name"]);
  26.  
  27. NSArray *person = @[p1,p2];
  28. NSLog(@"%@",person);
  29.  
  30. NSArray *arrayM = [person valueForKeyPath:@"book.bookName"];
  31. NSLog(@"%@",arrayM);
  32. }
  33.  
  34. @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:
  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Person : NSObject
  4. {
  5. NSString *_name;
  6. }
  7. @end
  1. #import "Person.h"
  2.  
  3. @implementation Person
  4. //接受被观察者发生变动后的通知
  5. -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
  6. {
  7. NSLog(@"%@,%@,%@,%@",keyPath,object,change,context);
  8. }
  9. @end

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

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Stock : NSObject
  4. {
  5. NSString *_name;
  6. float _price;
  7. }
  8. @end

  实现文件内容:

  1. #import "ViewController.h"
  2. #import "Person.h"
  3. #import "Stock.h"
  4. @interface ViewController ()
  5. @property(strong,nonatomic)Person *person;
  6. @property(strong,nonatomic)Stock *stock;
  7. @end
  8.  
  9. @implementation ViewController
  10.  
  11. - (void)viewDidLoad {
  12. [super viewDidLoad];
  13. //创建观察者
  14. self.person = [[Person alloc]init];
  15. [self.person setValue:@"Tom" forKey:@"_name"];
  16.  
  17. //创建股票
  18. self.stock = [[Stock alloc]init];
  19. [self.stock setValue:@"sxt" forKey:@"_name"];
  20. [self.stock setValue:@1.2 forKey:@"_price"];
  21.  
  22. //设置观察者
  23. [self.stock addObserver:self.person forKeyPath:@"_price" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"add"];
  24. }
  25. //单击按钮让股票价格加1
  26. - (IBAction)buttonClicked:(UIButton *)sender
  27. {
  28. float price = [[self.stock valueForKey:@"_price"]floatValue];
  29. [self.stock setValue:@(price+1.0) forKey:@"_price"];
  30. }
  31.  
  32. -(void)dealloc
  33. {
  34. //删除观察者
  35. [self.stock removeObserver:self.person forKeyPath:@"_price"];
  36. }
  37. @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. 006android初级篇之jni数据类型映射

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) 使用JNI的副作用 一旦使用JNI,JAVA程序就丧失了JAV ...

  2. linux c 常常混淆的概念

    指针函数 and 函数指针 指针函数是指带指针的函数,即本质是一个函数.函数都有返回类型(假设不返回值,则为无值型),仅仅只是指针函数返回类型是某一类型的指针. 定义格式 类型名 *函数名(函数參数列 ...

  3. ios -完全实现代码设置 Could not find a storyboard named 'Main' in bundle NSBundle

    UIWindow *windows = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; windows.background ...

  4. Golang中的正则表达式

    声明:文章转自GoLove 用法: 单一: . 匹配任意一个字符,如果设置 s = true,则可以匹配换行符 [字符类] 匹配"字符类"中的一个字符,"字符类" ...

  5. go生成xml

    package main import ( "encoding/xml" "fmt" // "os" ) type Servers stru ...

  6. aspx.cs方法设置webmenthod特性接收ajax请求

    cs代码: public partial class TelerikWebMethod : BasePage//System.Web.UI.Page { protected void Page_Loa ...

  7. 关于angularjs中的ng-class的使用

    在angularjs中,包子认为ng-class的用法是相当的大,这个相当于jquery的addClass和removeClass.在这个地方,废话不多说,直接上一小段代码 当kefu这个变量为真的时 ...

  8. 距离,margin padding ,width height 用法 ,记录

    margin:0 auto 表示什么意思 margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right 因为0 auto,表示上下边界为0,左右则根据宽度自适应 ...

  9. Linux 入门介绍

    背景:最近在搞redis 集群  ,然后有时候会怀疑自己,那么问题来了, 怀疑自己就是自己不扎实!  记忆不好了!  写下来备份吧! 才入门时候总是会想 ,Linux 下面文件夹都是什么意思! bin ...

  10. 64位matlab mex64位编译器解决方案

    安装libsvm的时候用到了mex -setup,有的会报 Could not find the 64-bit compiler. This may indicate that the "X ...