概念:
KVC即NSKeyValueCoding(键值编码),一种可以不通过 Getter或者Setter方式而直接通过对象属性字符串的方式对属性值进行编辑和访问的机制。KVO即NSKeyValueObserving(键值监听),一种当对象的属性值发生变化时,允许当前对象收到通知的机制。
KVC代码示例:
创建了一个person类,在其m文件添加如下变量@interface Person()
{
NSString *name;
NSNumber *age;
Student *student;
}
@end
@interface Person()
{
NSString *name;
NSNumber *age;
Student *student;
}
@end
其中Student类如下
@interface Student : NSObject
{
NSString *schoolNumber;
}
@end
@interface Student : NSObject
{
NSString *schoolNumber;
}
@end
在控制器中创建并采用kvc的方式对person 对象赋值和取值Person *person = [[Person alloc]init];
//KVC赋值
[person setValue:@"liwei" forKey:@"name"];
[person setValue:@24 forKey:@"age"];
Student *student = [[Student alloc]init];
[student setValue:@"201007020216" forKey:@"schoolNumber"];
[person setValue:student forKey:@"student"];
[person setValue:@"201007020217" forKeyPath:@"student.schoolNumber"];
//KVC取值
NSString *name = [person valueForKey:@"name"];
NSNumber *age = [person valueForKey:@"age"];
NSLog(@"个人信息\n name:%@\n age:%@",name,age);
//KVC通过键路径访问
NSString *schoolNumber = [person valueForKeyPath:@"student.schoolNumber"];
NSLog(@"%@",schoolNumber);
Person *person = [[Person alloc]init];
//KVC赋值
[person setValue:@"liwei" forKey:@"name"];
[person setValue:@24 forKey:@"age"];
Student *student = [[Student alloc]init];
[student setValue:@"201007020216" forKey:@"schoolNumber"];
[person setValue:student forKey:@"student"];
[person setValue:@"201007020217" forKeyPath:@"student.schoolNumber"];
//KVC取值
NSString *name = [person valueForKey:@"name"];
NSNumber *age = [person valueForKey:@"age"];
NSLog(@"个人信息\n name:%@\n age:%@",name,age);
//KVC通过键路径访问
NSString *schoolNumber = [person valueForKeyPath:@"student.schoolNumber"];
NSLog(@"%@",schoolNumber);
KVO代码示例:
#import "Person.h"
@interface Person()
{
NSString *name;
NSNumber *age;
Student *student;
}
@end
@implementation Person
- (instancetype)init{
self = [super init];
if (self) {
[self addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew| NSKeyValueObservingOptionOld context:nil];
}
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"name"]) {
NSString *name1 = [change objectForKey:@"new"];
NSLog(@"更名为:%@",name1);
}
}
- (void)dealloc{
[self removeObserver:self forKeyPath:@"age"];
}
#import "Person.h"
@interface Person()
{
NSString *name;
NSNumber *age;
Student *student;
}
@end
@implementation Person
- (instancetype)init{
self = [super init];
if (self) {
[self addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew| NSKeyValueObservingOptionOld context:nil];
}
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"name"]) {
NSString *name1 = [change objectForKey:@"new"];
NSLog(@"更名为:%@",name1);
}
}
- (void)dealloc{
[self removeObserver:self forKeyPath:@"age"];
}