KVO&KVC

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:(NSDictionaryid> *)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.csdn.net/lee727n/article/details/71513598

你可能感兴趣的:(ios开发基础)