KVC: (Key Value Coding) 键值编码

  所谓KVC,其实就是不通过set和get方法访问对象属性,而是通过属性名字符串动态的去读取属性。KVC其实也是OC反射机制的一种运用。

  之所以每个对象都有KVC能力,是因为NSObject类实现了NSKeyValueCoding协议。

  属性赋值: setValue:属性值 forKey:属性名

  属性读取:   valueForKey:属性名

  KVC比较常用的用处是在网络请求后要把得到NSDictionary数据要装入Model中,若要通过以往set方法赋值很麻烦,这时可以采用KVC方式,即model对象调用 setValuesForKeysWithDictionary:方法。这样简单粗暴,但是要注意参数dict中的键要和model的属性对应。一般必须要重写

KVO:(Key Value Observer)键值监听

  KVO的实现是因为NSObject类实现了NSKeyValueObserver协议,所以每个类都有KVO能力。

  当我们对对象的某属性敏感时,可以对该属性添加观察者,当该对象的这个属性值发生改变时就会触发回调方法。

  它的本质是观察者模式。(不过添加观察者和回调方法都是自己的方式,有别于观察者模式)

         KVO一般应用在数据模型值发生改变,UI界面随即显示新值。给model某属性添加观察,当值改变时触发回调方法:改变UI的UIlabel的的内容。

  实现KVO的步骤:

    1.给对象的某属性注册观察者(监听者):

    2.重写回调方法(当属性改变时触发)

    3.重写dealloc方法,在里面销毁观察者。

KVO和通知中心的本质都是观察模式,不过KVO是对于任何对象的属性都可以被观察;但通知中心是系统提供的,而且它是单例的。

Person.h

#import <Foundation/Foundation.h>
#import "BankCard.h" @interface Person : NSObject @property(nonatomic,copy) NSString * name;
@property(nonatomic,retain)BankCard * card; @end

Person.m

#import "Person.h"

@implementation Person

- (void)setCard:(BankCard *)card
{
_card = card;
[self.card addObserver:self forKeyPath:@"money" options:NSKeyValueObservingOptionNew context:nil]; //为card属性的money项注册观察者(监听器)
} //重写observeValueForKeyPath方法。回调方法,若money值发生改变,则触发
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if([keyPath isEqualToString:@"money"])
{
NSLog(@"您账户的余额发生变动,余额为%i",self.card.money);
}
} //重写dealloc方法,移除监听。当
- (void)dealloc
{
[self.card removeObserver:self forKeyPath:@"money"]; //移除监听
} @end

BankCard.h

#import <Foundation/Foundation.h>

@interface BankCard : NSObject

@property(nonatomic,assign) long cardID;
@property(nonatomic,assign) int money; @end

BankCard.m

#import "BankCard.h"

@implementation BankCard

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "BankCard.h" int main(int argc, const char * argv[])
{ @autoreleasepool { Person * person = [[Person alloc]init];
BankCard * card = [[BankCard alloc]init];
card.money = ;
person.card = card; NSLog(@"卡被盗了后...");
card.money = ; }
return ;
}

在Person类中,为card属性的money项注册了监听器,当银行卡被盗了后,人家把余额取完了。因为money的值发生了改变,所以重写的回调方法触发。

参考:点击进入 

QF——OC中的KVC,KVO的更多相关文章

  1. QF——OC中的SEL类型和Block

    @selector(): 可以理解@selector()就是取类方法的编号,他的基本行为类似于C语言中的函数指针(指向函数的指针).它们通过传递方法的地址(或编号)来实现把方法当做参数的效果. 不过在 ...

  2. IOS开发-OC学习-kvc,kvo

    kvc是用来方便的设置实例的属性值的,比如person类的实例p1有一个name的属性,那么我们可以通过kvc去设置p1的name,语法是: [ 对象 setValue:@"xiaming& ...

  3. KVC , KVO , KVB

    来源:http://www.cnblogs.com/jay-dong/archive/2012/12/13/2815778.html 熟悉oc语法的同学也许都会懂得这么一点:在oc中,类的成员变量或是 ...

  4. 设计模式之观察者模式(关于OC中的KVO\KVC\NSNotification)

    学习了这么久的设计模式方面的知识,最大的感触就是,设计模式不能脱离语言特性.近段时间所看的两本书籍,<大话设计模式>里面的代码是C#写的,有一些设计模式实现起来也是采用了C#的语言特性(C ...

  5. iOS中关于KVC与KVO知识点

    iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点  一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...

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

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

  7. iOS: 消息通信中的Notification&KVO

    iOS: 消息通信中的Notification&KVO 在 iOS: MVC 中,我贴了张经典图: 其中的Model向Controller通信的Noification&KVO为何物呢? ...

  8. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  9. 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO

    知识点复习   1. 触摸事件&手势识别   1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加)   附加在某一个特定视图上的, ...

随机推荐

  1. C#操作项目配置文件

    前言 对于项目配置文件的读取和修改,.net 提供了ConfigurationManager(位于System.Configuration命名空间) 和WebConfigurationManager( ...

  2. RequiredFieldValidator验证下拉列表框

    <asp:DropDownList ID="DropDownList1" runat="server" CssClass="style01&qu ...

  3. JDK8环境变量配置相关问题

    1.右键选择 计算机→属性→高级系统设置→高级→环境变量 2.系统变量→新建 变量名:JAVA_HOME 变量值:(变量值填写你的jdk的安装目录,例如本人是 E:Javajdk1.7.0) 3.在系 ...

  4. Oracle触发器Trigger2行级

    create table trigger_t2( id int, name ), age int ); /* --创建一个before update的触发器-控制每一行,行级 --只有行级的才会有:n ...

  5. android MVC理解

    算来学习Android开发已有2年的历史了,在这2年的学习当中,基本掌握了Android的基础知识.越到后面的学习越感觉困难,一来是自认为android没啥可学的了(自认为的,其实还有很多知识科学), ...

  6. STM32学习笔记之一(初窥STM32)

    怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...

  7. C++命名准则

    总则:命名用英语,单词简单,明了.意义明确.过长的单词可以使用省略.一般是去掉元音字母形成省略.如果有通用的缩写,应该采用通用的缩写. 1.函数命名 1.1:全局函数:采用限定词+动词(+名词的原则) ...

  8. 《C++ Primer Plus 6th》读书笔记 - 第九章 内存模型和名称空间

    1. 单独编译 1.1 头文件中常包含的内容: 函数原型 使用#define或const定义的符号常量 结构声明 类声明 模板声明 内联声明 1.2 只需将源代码文件加入到项目中,而不用加入头文件.这 ...

  9. ubuntu14.04中mysql的安裝及utf8编码集配置

    mysql的安裝使用sudo apt-get install mysql-server即可安裝,我安裝的是5.6版.安装过程中会要求输入root账户的密码,按提示输入即可. Mysql Workben ...

  10. phpcms在自定义模块中的自定义标签分页

    如果你是一个经验丰富的phpcms二次开发人员,本篇文章可以忽略不计,因为这里的写法自己都觉得很恶心        今天在开发一个网站自建了一个模块叫做论坛模块,目录名称:luntan        ...