OC高级语法之KVC和KVO的学习

这是OC语法中重要的部分,学习者绝对不能因为想偷懒而不学这个。

一、键值编码KVC(Key Value Coding)

相对KVO,这个比较简单。

1.  最基本的KVC由NSKeyValueCoding协议提供支持,基本的操作属性的两个方法:

setVlaue:属性值   forKey:属性名  ---》这是为指定属性设置值

valueForKey:属性名  ---》获取指定属性的值

举例:User *user = [ [ User alloc] init ] ;

[user setValue:@"孙悟空" forKey:@"name"];

NSLog(  @" user的name为:%@ " , [user  valueForKey:@"name"] );

打印结果:user的name为:孙悟空

2.  KVC除了操作对象的属性外,还可操作对象的“复合属性”。所谓“复合属性”,简单来说,就是一个对象作为另一个对象的一个属性。KVC机制将其成为Key路径。

KVC协议中为操作Key路径的方法如下:

setValue:forKeyPath: ---》根据Key路径设置属性值

valueForKeyPath: ---》根据Key路径获取属性值

举例如下:

Apples.h

#import <Foundation/Foundation.h>

@interface Apples : NSObject
{
@private
    NSString *_name;
    float _price;
}
@end

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_name;
    NSArray *_apples;
}
@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Apples.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //KVC练习
        
        Apples *mac = [[Apples alloc]init];
        [mac setValue:@"macbook" forKey:@"_name"];
        [mac setValue:@8000 forKey:@"price"];
        
        Apples *iphone = [[Apples alloc]init];
        [iphone setValue:@"iphone" forKey:@"_name"];
        [iphone setValue:@5000 forKey:@"price"];
        
        Apples *ipad = [[Apples alloc]init];
        [ipad setValue:@"ipad" forKey:@"_name"];
        [ipad setValue:@3800 forKey:@"price"];
        
        NSArray *apples = @[mac, iphone, ipad];
        
        Person *p = [[Person alloc]init];
        [p setValue:@"乔布斯" forKey:@"name"];
        [p setValue:apples forKey:@"apples"];
        
        NSLog(@"%@",p);
        
        //计算数组中所有price的和(运算的字段必须是数值类型NSNumber或者基本数据类型,返回NSNumber)
        NSNumber *sum = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@sum</span>._price"];
        NSLog(@"sum:%@",sum);
        
        NSNumber *min = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@min</span>._price"];
        NSLog(@"min:%@",min);
        
        NSNumber *max = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@max</span>._price"];
        NSLog(@"max:%@",max);
        
        NSNumber *avg = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@avg</span>._price"];//平均值
        NSLog(@"avg:%@",avg);
        
        NSNumber *count = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@count</span>._price"];
        NSLog(@"count:%@",count);
    }
    return 0;
}


二、键值监听KVO(Key Value Observing)

实现监听。主要两步:

1.  注册监听

[_child addObserver:self forKeyPath:@"happyVal" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

forKeyPath是要监听的属性


2.  实现监听方法

//监听后执行的方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    
    NSLog(@"change:%@",change);
}

object代表监听的对象。change代表发生的改变。

最后,记得移除监听:重写父类dealloc方法,

- (void)dealloc
{
    [_child removeObserver:self forKeyPath:@"happyVal"];
}


打印结果:

change:{
    kind = 1;
    new = 99;
    old = 99;
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值