KVC与KVO
1.KVC
KVC--Key-Value-Coding 可以直接通过字符串的名字(key)来访问类属性(实例变量)的机制,不用调用setter、getter方法访问,当使用KVO,CoreData,CocaaBindings,AppleScript(Mac支持)时,KVC是关键技术。
Person *xw = [[Person alloc ]init];
//使用kvc设置成员变量的值
//使用之前必须知道变量的名
[xw setValue:@"xiaowang"forKey:@"name"]; -----------name必须是变量的名不能有一点差别
NSString *name = [xw valueForKey:@"name"];-------读取Key的值
NSLog(@"%@",name);
//设置对象里的某个类的某个属性 确定类的对象一定是存在的
Dog *dog = [[Dog alloc]init];-------要先有dog的对象
[xw setValue:dg forKey:@"dg"];
[xw setValue:@"wangwang"forKeyPath:@"dg.dogName"];
NSString *dgname = [xw valueForKeyPath:@"dg.dogName"];
NSLog(@"%@",dgname);
2.KVO
KVO:Key-Value-Observing,提供一种机制,当指定的对象的属性被修改后,则对象就会接收到通知,简单的说就是每次指定的被观察对象的属性被修改后,KVO就会自动通知相应 的观察者;
系统框架已经支持KVO,所以程序员在使用的时候非常简单。
1,注册,指定被观察者的属性
2,实现回调方法
3.移除观察
cread.h中定义int money;
Person.h中定义cread *card;
Person.m中实现
-(instancetype)init{
if(self = [super init]){
self.card = [[[Creat alloc]init]autorelease];
//添加监听器,监听cread中money的变化之前和之后的值
[self addOberve:self forKeyPath:@"cread.money" options:NSKeyObservingOptionOld|NSKeyObservingOptionNew context:nil];
}
return self;
}
//回调
-(void)obseveValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id>*)change context:(void*)context{
int oldValue = [[change objectForKey:NSKey:NSKeyValueChangeOldKey] intValue];
int newValue = [[change objectForKey:NSKey:NSKeyValueChangeNewKey]intValue];
NSLog(@"old:%d",[[change objectForKey:NSKeyValueVhangeOldKey]initValue]);
NSLog(@"new:%d",[[change objectForKey:NSKeyValueChangeNewKey]initValue]);
}
//销毁
-(void)dealloc{
[_cread realease];
[self removeObserver:self forKeyPath:@"cread.money"];
[super dealloc];
}
main.m实现
Person *xw = [[[Person alloc]init]autorelease];
[xw setValue:@1000 forKeyPath:@"cread.money"];
[xw setValue:@2000 forKeypath:@"cread.money"];
}
return 0 ;
}