KVO和KVC的区别,这是一道面试经常会问到的题。其实这两个根本就没有什么关系。下面我们来通过一个demo来认识一下KVC和KVC,同时通过这个demo来看一下Model层对Controller层之间的通信。Notification和kvo
自定义model层,person类
@implementation Person
- (instancetype)init
{
self = [super init];
if (self) {
[NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
self.age++;
// [[NSNotificationCenter defaultCenter]postNotificationName:@"改变年龄通知" object:self];
}];
}
return self;
}
@end
CONTROLLER中代码
- (void)viewDidLoad {
[super viewDidLoad];
Person *p = [Person new];
p.age = 10;
p.name = @"zhangsan";
//通过kvc的方式对对象的属性赋值和取值
// [p setValue:@"xiaoming" forKey:@"name"];
//
// NSString *name = [p valueForKey:@"name"];
self.ageLabel.text = @(p.age).stringValue;
// 通过NOtification实现M和C的交互
// [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(ageChangeAction:) name:@"改变年龄通知" object:nil];
//通过KVO监听Person中age值的改变
[p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
Notification对应的方法
//- (void)ageChangeAction:(NSNotification *)noti{
// Person *p = noti.object;
//
// self.ageLabel.text = @(p.age).stringValue;
//}
KVO对应的方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
Person *p = object;
self.ageLabel.text = @(p.age).stringValue;
}
可以看到KVO还有通知都是检测到Model层年龄的改变告诉Controller层。让Controller层收到数据。
而KVC是对对象的属性赋值。Key Value coding
KVO和KVO完全是两个不想关的东西!!!!!
如果对MVC之间通信,相互传送数据,消息还有不明白的同学,可以参考附代码分析的MVC通信博客:
http://blog.youkuaiyun.com/lee727n/article/details/71513598