1、KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。(关键点:访问对象的属性!)
例子:
//定义一个Person类 有两个属性name 和 age
@interface Person : NSObject
{
NSString*_name;
int _age;
} @end
//定义一个viewController 用来测试(如果你已经学到UI阶段就用viewController,如果没学到就在main函数里面实现)
#import "Person.h"
@interface ViewController :UIViewController
@property (nonatomic, retain) Person* testPerson;
@end
- (void)viewDidLoad {
[superviewDidLoad];
//创建Person对象
testPerson = [[myPerson alloc] init];
//设置age属性的值
[testPerson setValue:[NSNumber numberWithInt:18] forKey:@"age"];
//获取age的值
NSLog(@"testPerson‘s age = %@", [testPerson valueForKey:@"age"]);
}
就这两个方法:
- (id)valueForKey:(NSString *)key;
-(void)setValue:(id)value forKey:(NSString *)key;
key是要设置的age属性,value 是age的值
2、KVO的是KeyValue Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。
设置就3步:
1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:(一般添加self为观察者)
2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用(这是一个回调方法)
3.取消注册观察removeObserver:forKeyPath:context:(在dealloc里面写)
例子:
//定义一个Person类 有两个属性name 和 age
@interface Person : NSObject
{
NSString*_name;
int _age;
} @end
//定义一个viewController 用来测试
#import "Person.h"
@interface ViewController :UIViewController
@property (nonatomic, retain) Person* testPerson;
@end
- (void)viewDidLoad {
[superviewDidLoad];
//创建Person对象
testPerson = [[myPerson alloc] init];
//第一步:添加观察者self
[testPerson addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
//第二步 添加回调方法 当要观察的值发生变化时 进行自己想要的操作
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"age"]) {
NSLog(@"new Age =%@", [change valueForKey:NSKeyValueChangeNewKey]);
}
}
//第三步移除观察者
- (void)dealloc
{
[testPerson removeObserver:self forKeyPath:@"age" context:nil];
[super dealloc];
}
感谢码迷的文章