XZ_iOS之KVC

KVC:键 - 值编码是一种间接访问对象的属性,使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。KVO:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
具体用看到用到过的一个地方是对于按钮点击变化状态的的监控。
比如我自定义的一个button
,
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; 
 

 
#pragma mark KVO 
 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{
  
    if ([keyPath isEqualToString:@"highlighted"] ) { 
 
          [self setNeedsDisplay]; 
   
   } 
 }
对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
对于kvc机制如何通过key寻找到value:
“当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用
-(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
 
 
     
 
设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。

因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就可以了。

利用KVC可以随意修改一个对象的属性或者成员变量(并且私有的也可以修改)
[p setValue:@10.5 forKey:@"_height”];
[p setValue:@10.5 forKey:@"height”];// 先去找height的成员变量,如果没有,再去找_height,所以,写_和不写都可以;

KVC作用:系统的一些东西不好用的时候,替换系统的一些东西
比如UINavigationBar,自定义一个navigationBar替换系统的navigationBar,
XZNavigationBar *navigationBar = [[XZNavigationBar alloc]init];
[self setValue:navigationBar forKeyPath:@“navigationBar”];
”setValue:forKeyPath:“和”setValue:forKey:“的区别
// 路径:一层层的往下找;功能强大,包含forKey的功能,以后使用forKeyPath就可以了;forKeyPath可以利用.运算符,就可以一层一层往下查找对象的属性。
[p setValue:@“hashiqi” forKeyPath:@“dog.name”];
// 写法错误,会崩溃,因为P里面没有dog.name这个属性。
[p setValue:@“hashiqi” forKeyPath:@“dog.name”];
// 取属性值
[p valueForKeyPath:@“dog.name”]; // 结果是hashiqi
// 获取所有书名(将所有书名放在一个数组中)
1>可以遍历每一本书,获得书名,添加到可变数组中
NSMutableArray *names = [NSMutableArray array];
for(Book *book in p.books){
     [names addObject:book.name];
}
2>使用KVC:先取出books数组中每一个元素的name属性值,放到一个新的数组中返回.
NSArray *names = [p valueForKeyPath:@“books.name"];
// 计算所有的书的价格的总和:默认返回的是NSNumber类型
double sum = [[p valueForKeyPath:@“books.@sum.price”] doubleValue];
// 算平均数是:@avg
double sum = [[p valueForKeyPath:@“books.@avg.price”] doubleValue];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值