KVC和KVO的简单对比

一、对于KVC模式(Key Value Coding):

1、其实在实际开发中用得比较多得就是:接收到json数据之后,通过解析,解析成NSDictionary,然后再把字典对应的字段建立一个Model,在Model里面自定义一个类方法+(instancetype)modelWithDictionary:(NSDictionary *)keyDictionary方法中调用

?


1

[self setValuesForKeysWithDictionary:jsonObject];

从而达到我们想要的效果,将字典装成Model。

2、然后对于一些想要特殊处理的字段可以调用以下方法来进行特殊处理,比如里面有些key是字典类型,则可以通过以下方式搞定:

?


1

2

3

4

5

6

7

8

9

10

11

-(void) setValue:(id)value forKey:(NSString *)key 

  if([key isEqualToString:@"products"]) 

  

    for(NSMutableDictionary *productDict in value) 

    

      Prodcut *product = [[Product alloc] initWithDictionary:prodcutDict]; 

      [self.products addObject:product]; 

    

  

}

3、还有一种情况,就是里面的Key压根就没定义,可以通过重写以下这个方法来重新把key和value对应上号:

?


1

2

3

4

5

6

7

8

9

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 

    if([key isEqualToString:@"nameXXX"]) 

        self.name = value; 

    if([key isEqualToString:@"ageXXX"]) 

        self.age = value; 

    else

        [super setValue:value forKey:key]; 

}

二、对于KVO模式(Key-Value Observing):

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

KVO的优点:
当有属性改变,KVO会提供自动的消息通知。这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。
这是KVO机制提供的最大的优点。因为这个方案已经被明确定义,获得框架级支持,可以方便地采用。
开发人员不需要添加任何代码,不需要设计自己的观察者模型,直接可以在工程里使用。
其次,KVO的架构非常的强大,可以很容易的支持多个观察者观察同 一个属性,以及相关的值。

使用步骤如下:
1. 注册,指定被观察者的属性,
2. 实现回调方法
3. 触发回调方法
4. 移除观察

KVO使用例子代码如下:
###############Model(模型)###############
#import <Foundation/Foundation.h>
@interface Music : NSObject {
    // 监听的属性
    NSString *musicName;
}
@end

#import "Music.h"
@implementation Music
@end

###############ViewController(视图控制器)###############
#import <UIKit/UIKit.h>
@class Music;
@interface ViewController : UIViewController {
    Music *music;   
}
@property (nonatomic, retain) Music *music;
@end

@implementation ViewController
@synthesize music;

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    music = [[Music alloc] init];
   
    // 添加观察者  注册当属性发生改变的时候被调用的
    [music addObserver:self forKeyPath:@"musicName" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
   
    // UILabel控件
    UILabel *musicLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 150, 280, 21)];
    musicLabel.font = [UIFont fontWithName:@"ArialMT" size:18];
    musicLabel.textColor = [UIColor redColor];
    musicLabel.tag = 100;
    [self.view addSubview:musicLabel];
    [musicLabel release];
   
    // UITextField控件
    UITextField *musicTextField = [[UITextField alloc] initWithFrame:CGRectMake(20, 200, 280, 21)];
    musicTextField.font = [UIFont fontWithName:@"ArialMT" size:18];
    musicTextField.placeholder = @"Please enter some words.";
    musicTextField.backgroundColor = [UIColor whiteColor];
   
    // UITextField输入内容时候调用
    [musicTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
   
    [self.view addSubview:musicTextField];
    [musicTextField release];

self.view.backgroundColor = [UIColor grayColor];
}

- (void)textFieldDidChange:(id)sender {
    UITextField *textField = (UITextField *)sender;
    NSLog(@">>>>>>>>>>>>>>>%@",textField.text);
    // 修改正在监听的属性,将调用下面回调方法
    [music setValue:textField.text forKey:@"musicName"];
}

// 只要Music类的"musicName"属性发生的变化都会触发到以下的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    UILabel *label = (UILabel *)[self.view viewWithTag:100];
    // 如果改变的属性是"musicName"
    if ([keyPath isEqualToString:@"musicName"]) {
        // 将 当前的musicName属性的值 赋值给UILabel
        label.text = [music valueForKey:@"musicName"];
        // 输出改变前的值
        NSLog(@"old musicName is %@",[change objectForKey:@"old"]);
        // 输出改变后的值
        NSLog(@"new musicName is %@",[change objectForKey:@"new"]);        
    }
}

#pragma mark - Memory Management
- (void)dealloc {
    // 移除观察者
    [music removeObserver:self forKeyPath:@"musicName"];
    [music release];
    [super dealloc];
}

时间: 2024-10-14 05:07:20

KVC和KVO的简单对比的相关文章

iOS KVC 和 KVO 区别简单总结

KVC: key value coding,键值编码.是一种通过使用属性的名称(key)来间接访问对象属性的方法.这个方法可以不用通过 setter/getter 方法来访问对象的属性.该方法使用的实质是,是使用 valueForKey来代替 getter 方法, setValueForKey 来代替 setter 方法. KVC 常用的方法: - (id)ValueForKey:   通过 key 值读取对象的属性 -(id)setValue: forKey: 通过 key 的值来使用属性 -

iOS KVC与KVO的简单使用

#import "ViewController.h" #import <Foundation/Foundation.h> @interface DataModel : NSObject @property (nonatomic,copy)NSString *stockName; @property (nonatomic,assign)float price; @end @implementation DataModel @end @interface ViewControl

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

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的理解

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

[Objective-C] 021 KVC、KVO

写过C#的都知道C#通过反射读写一个对象的属性特别方便,可以利用字符串的方式去动态控制一个对象.其实在ObjC中,我们可以更高级点,根本不必进行任何操作就可以进行属性的动态读写,这种方式就是Key Value Coding(简称KVC). KVC(键值编码) KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议,也就是说ObjC中几乎所有的对象都支持KVC操作,常用的KVC操作方法如下: 动态设置: setValue:属性值 forKey:属性名(用于简

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#中可以通过反射读写一个对象的属性,有时候这种方式特别方

[原创]obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用

原文链接:obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用 我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么下面我们就用一个实际中的例子来看看KVC与KVO是如何运用的吧. 该例中用到了3种新的控件类型:NSTableView.NSSlider以及简单的NSTextField类型.按说不能再在Random类里添加不沾边的新增功能了,但是为了简单,我还是把所有东西都放在Random类里喽.程序运行时界面如下