kvc VS kvo

Kvo是Cocoa的一个重要机制,它主要是用于对一个属性的新旧值的监控。比方说根据A(数 据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于MVC,kvo应用的地方非常广泛。

使用kvo流程:

1 注册:

-(void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context

keyPath就是要观察的属性值,options给你观察键值变化的选择,而context方便传输你需要的数据

2 实现变化方法:

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object

change:(NSDictionary *)change context:(void*)context

change里存储了一些变化的数据,比如变化前的数据,变化后的数据

KVC是一种间接访问对象属性(用字符串表征)的机制,而不是直接调用对象的accessor方法或是直接访问成员对象。

key就是确定对象某个值的字符串,它通常和accessor方法或是变量同名。Key path就是以“.”分隔的key,因为属性值也能包含属性。

获取属性值时可以通过valueForKey:的方法,设置属性值用setValue:forKey:。与此同时,KVC还对未定义的属性值定义了 valueForUndefinedKey:,你可以重载以获取你要的实现

在O-C 2.0引入了property,我们也可以通过.运算符来访问属性,例如:

@property NSInteger number;

instance.number =5;

[instance setValue:[NSNumber numberWithInteger:5] forKey:@"number"];

以上介绍了通过KVC来获取/设置属性,接下来要说明下实现KVC的访问器方法。

-key:,以及setKey:(使用的name convention和setter/getter命名一致)。对于未定义的属性可以用setNilValueForKey:。

在ios中,array往往做为tableview的数据源,例如:

假设我们已经有N条数据,在进行了某个操作后,有在原先的数据后多了几条记录;或者对N中的某些数据进行更新替换。不使用KVC我们可以使用 reloadData方法或reloadRowsAtIndexPaths。前一种的弊端在于如果N很大消耗就很大。试想你只添加了几条数据却要重载之前 N数据。后一种方法的不足在于代码会很冗余,你要一次计算各个indexPath再去reload,而且还要提前想好究竟在哪些情况下会引起数据更新,

倘若使用了KVC,你将不用关心追加或是更新多少条数据。

实现insertObject:inKeyAtIndex:或者insertKey:atIndexes。同时在kvo中我们可以通过change这个dictionary得知发生了哪种变化来做相应的处理。

时间: 2024-11-26 02:48:41

kvc VS kvo的相关文章

OC学习篇之---KVC和KVO操作

前一篇文章我们介绍了OC中最常用的文件操作:http://blog.csdn.net/jiangwei0910410003/article/details/41875015,那么今天来看一下OC中的一个比较有特色的知识点:KVC和KVO 一.KVC操作 OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力的,这样做就会破坏类的封装性,本来类中的的private权限就是不希望外界去访问的,但是我们这样去操作,就会反其道而行,但是我们有时候真的需要去这样做,哎.所以

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

11. KVC And KVO

1. KVC And KVO  的认识 KVC/KVO是观察者模式的一种实现  KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制.KVO全称是Key-value observing,翻译成键值观察.提供了一种当其它对象属性被修改的时候能通知当前对象的机制.再MVC大行其道的Cocoa中,KVO机制很适合实现model和controller类之间的通讯. 2. KVC And

iOS开发中KVC、KVO简介

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

KVC、KVO实现过程

1.KVC的实现过程 以 [object setValue:@"134567" forKey:@"uid"];为例子,来探究KVC的实现过程 第一步:搜索1.首先搜索setKey:方法.(key指成员变量名, 首字母大写)2.上面的setter方法没找到, 如果类方法accessInstanceVariablesDirectly返回YES. 那么按 _key, _isKey,key, iskey的顺序搜索成员名.(NSKeyValueCodingCatogery中实

KVC 与 KVO 理解-b

KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就是基于 KVC 实现的关键技术之一. 一个对象拥有某些属性.比如说,一个 Person 对象有一个 name 和一个 address 属性.以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 a

对KVC和KVO的理解

对KVC和KVO的理解 kvc kvo KVC KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制.而不是通过调用Setter.Getter方法访问. KVC实例 一个对象拥有某些属性.比如说,一个Person对象有一个name和一个address属性.以KVC为例,Person对象分别有一个value对应他的name和address的key.key只是一个字符串,它对应的值可以是任意类型的对象.从最基础的层次上看,KVC有两个方法:一个是设

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 =

KVC 与 KVO

IOS开发系列--Objective-C之KVC.KVO 2014-07-27 11:29 by KenshinCui, 18479 阅读, 9 评论, 收藏, 编辑 概述 由于ObjC主要基于Smalltalk进行设计,因此它有很多类似于Ruby.Python的动态特性,例如动态类型.动态加载.动态绑定等.今天我们着重介绍ObjC中的键值编码(KVC).键值监听(KVO)特性: 键值编码KVC 键值监听KVO 键值编码KVC 我们知道在C#中可以通过反射读写一个对象的属性,有时候这种方式特别方

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

转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就是基于 KVC 实现的关键技术之一. 一个对象拥有某些属性.比如说,一个 Person 对象有一个 name 和一个 address 属性.以 KV