KVO与KVC

1 KVO

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.p = [[Person alloc] init];
    self.p.age = 20;
    
    //KVO属性监听
    //监控某个属性的值改变就会调用
    [self.p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    /*
     * keyPath 属性名(哪个属性被改)
     * object  哪个对象的属性被改了
     * change  属性的修改情况
     * context void * == id 传值
     */
}

//和通知一样,需要释放
-(void)dealloc
{
    [self.p removeObserver:self forKeyPath:@"age"];
}


2.KVC

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.p = [[Person alloc] init];
    self.p.age = 20;
    
    //KVC键值检测
    
    //1.间接通过字符串类型的key取出对应的属性值
    int age = [[self.p valueForKey:@"age"] intValue];
    /*
     *注意:valueForKey取出来的类型是id,id是对象类型,所以对应是NSNumber
     */
    
    //2.取出私有属性的值
    
    //3.keyPath与key:keyPath包含了key的功能,key只能访问当前对象的属性,而keyPath能访问多层内部属性
    [self.p valueForKeyPath:@"dog.name"];
    
    //4.keyPath的特殊用法
    WTBook *b1 = [[WTBook alloc] init];
    b1.name = @"kuaihua";
    b1.price = 100.6;
    
    WTBook *b2 = [[WTBook alloc] init];
    b2.name = @"prixe";
    b2.price = 5.6;
    
    WTBook *b3 = [[WTBook alloc] init];
    b3.name = @"jiuxin";
    b3.price = 50.5;
    
    self.p.books = @[b1,b2,b3];
    
    //直接拿出p.books的name
    NSArray *names = [self.p.books valueForKeyPath:@"name"];
    NSArray *names2 = [self.p valueForKeyPath:@"books.name"];
    
    //计算长度
    [self.p valueForKeyPath:@"books.@count"];
    
    //直接计算出p的book的书的价格总和
    [self.p valueForKeyPath:@"[email protected]"];
    [self.p valueForKeyPath:@"[email protected]"];
    [self.p valueForKeyPath:@"[email protected]"];
    [self.p valueForKeyPath:@"[email protected]"];
}


你可能感兴趣的:(KVO与KVC)