码迷,mamicode.com
首页 > 其他好文 > 详细

QF——OC中的KVC,KVO

时间:2015-03-08 14:13:00      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

KVC: (Key Value Coding) 键值编码

  所谓KVC,其实就是不通过set和get方法访问属性,而是通过其他几个方法。

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

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

  属性读取:   valueForKey:属性名

 

KVO:(Key Value Observer)键值监听

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

  简单说,KVO就是监听对象的属性,当属性的值发生变化时,它会自动触发一个方法,我们可以用这个方法给我们发送消息,或进行处理。

  它的本质是

观察者模式。

  实现KVO的步骤:

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

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

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

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 = 1000;
        person.card = card;
        
        NSLog(@"卡被盗了后...");
        card.money = 0;
        
        
    }
    return 0;
}

 

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

 

参考:点击进入 

 

QF——OC中的KVC,KVO

标签:

原文地址:http://www.cnblogs.com/wangerxiansheng/p/4321647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!