标签:
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的值发生了改变,所以重写的回调方法触发。
参考:点击进入
标签:
原文地址:http://www.cnblogs.com/wangerxiansheng/p/4321647.html