oc的kvc模式


// 我们一般通过调用set方法或属性的点语法来直接更改对象的状态,即对象的属性 kvc是一种简洁更改对象状态的方式,其使用方法是使用描叙对象需要更改的属性。kvc中的基本调用包括valueForKey setValueForKey以字符串的形式向对象发送消息使用下面的例子

//@interface Card : NSObject

//@property (nonatomic,assign) int no;

//@end

//

//@interface Student : NSObject

//

//@property (nonatomic,assign) int age;

//

//@property (nonatomic,copy) NSString *name;

//

//@property (nonatomic,retain) Card *card;

//

//@end


//valueForKey:获取Student对象的name

//NSString *name = [student valueForKey:@"name"];

//valueForKey:首先查找以nameisName命名的getter方法,如果不存在getter方法,就在对象内部查找名为_namename的实例变量


//下面的语法是合法的

// NSLog(@"age is %@ ",[Student valueForKey:@"age"]);

//    NSLog中的%@输出一个对象但age是一个int值而不是一个对象 为什么会合理呢

//    因为在使用valueForKey kvc会自动将标量值(intfloatstruct)等翻入NSNumberNSValue中包装成对象,因此valueforkey具有自动包装功能

//    使用setValue:ForKey:设置Student对象的name

//    [student setValue:@"MJ" forKey:@"name"];

//    这个方法的工作方式和valueForKey:相同,首先查找setter方法,例如setName:,如果不存在setter方法,就在类中查找名为name或者_name的实例变量,然后为它赋值

//

//    使用setValue:ForKey:设置Student对象的age

//    [student setValue:[NSNumber numberWithInt:17] forKey:@"age"];

//    使用kvc在设置一个标量时,需要先将标量值包装成一个NSNumberNSvalue对象

//    kvc 可以对对象进行批量更改

//    同时获取Studentagename

//    NSArray *keys = [NSArray arrayWithObjects:@"name",@"age",nil];


//    NSDictionary *dict = [student dictionaryWithValuesForKeys:keys];

//    同时设置Studentagename

//    NSArray *keys = [NSArray arrayWithObjects:@"name", @"age", nil];

//    NSArray *values = [NSArray arrayWithObjects:@"MJ", [NSNumber numberWithInt:16], nil];

//    NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];

//    [student setValuesForKeysWithDictionary:dict];


//除了通过键设置值外,kvc还支持键路径像文件系统路径一样,其实就是属性链式访问

//比如 利用键路径设置Student对象中的card对象的no

//    [student setValue:@"12345" forKeyPath:@"card.no"];

//  [student valueForKeyPath:@"card.no"];

//如果向一个NSarray请求一个keyKVC会查询数组中的每个对象来查找这个key然后将查询结果打包到另一个数组中并返回

//    获取Student中所有Bookname

//    NSArray *names = [student.books valueForKeyPath:@"name"]; 或者

//    NSArray *names = [student valueForKeyPath:@"books.name"];

//    注意:不能在键路径中为数组添加索引,比如@"books[0].name"

//键路径运算符

    //在键路径中,可以引用一些运算符来进行一些运算,例如可以获取一组值的平均值 ,最小值,最大值或者总数

    //例如计算Student中的所有book的价钱(price)总和

//    NSNumber *count = [student.books valueFOrKEyPath:@"@count"];

//    NSNumber *count =  [student valueFOrKEyPath:@"books.@count"];

    

    //计算Studengt中所有Book的价钱(price)总和

//    NSNumber *sum = [student.books valueFOrKEyPath:@"@count"];

//    

//    NSNumber *sum =  [student valueFOrKEyPath:@"books.@count"];


//   找出Student中的book的所有不同价位÷

//    NSArray *prices = [student.books valueFOrKeyPath:@"distinctUnionOfObjects.price"];

//

//    NSArray *prices = [student valueForKeyPath:@"books.@distinctUnionOfObjects.price"];

    

//    KVOkey value observing

//    kvo 是一种非常重要的机制,它允许监听对象的属性的变化

//    -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context

//    anObserver :监听器对象

//    keyPath :监听的属性

//    options :决定了当属性改变时,要传递什么数据给监听器

    

//    监听器需要实现监听方法

//    -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object

//change:(NSDictionary *)change context:(void *)context

//    keyPath :监听的属性

//    object :谁的属性改变了

//    change :属性改变时传递过来的信息(取决于添加监听器时的options参数)

//    监听器需要实现监听方法

//    -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object

//change:(NSDictionary *)change context:(void *)context

//    keyPath :监听的属性

//    object :谁的属性改变了

//    change :属性改变时传递过来的信息(取决于添加监听器时的options参数)

//    

//    移除监听器

//    -(void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值