cocoa 的大招(KVC的几点强大应用记录)
1、利用KVC可以修改系统的只读变量
简单的KVC和我们平常通过一个“类名.属性”赋值一般:
teacher.name = @"灭绝师太";
[teacher setValue:@"灭绝" forKey:@"name"];
但是我们知道,类名.属性赋值如果是readOnly只读的话,我们是不能直接赋值的,但是强大的KVC可以。
#例如应用于我们的自定义tabBar,如果我们想通过self.tabBar = [XBTarBar alloc] init]; 是不行的,因为tabBar是系统只读的变量,但是我们通过KVC的方式来改造里面的值(同样方法也是适用于navigation):
[self setValue:[XBTarBar alloc] init] forKey:@"tarBar"];
2、利用KVC可以随意修改一个对象的属性和变量(即使是私有变量)
例如:
@implementation Teacher
{
@private NSNumber_age;
}
我们通过这样的方式:
[teacher setValue:@30 forKey:@"_age"];
[teacher setValue:@30 forKeyPath:@"_age"];
其实也是可以通过@"age"也是可以的,因为KVC内部逻辑是先去查找有无“age”属性,再去查找“_age”.
3、KVC可以通过运算符层次查找对象的属性
在上面的2中,我们大概知道KVC可以通过类.属性查找对象,同时也是可以层次来查找的:
Teacher *t = [Teacher alloc ] init];
t.chiild = [Child alloc ] init];
t.child.book = [Book alloc] init];
KVC 大招:XBLog(@"%@",ValueForKeyPath(@"child.book"));
4、由3,还有:KVC获取值不仅可以返回一个数据,还可以将某一个属性的所有值,数据归类出来(B不一定是类,也可以是数组)
NSArray *arr = [t ValueForKeyPath(@"book.price");// 返回的是所有书的价格的数组集合
5、KVC还可以通过复杂的数学运算获取属性的值
NSNumber value = [t ValueForKeyPath(@"book.@sum.price");
NSNumber value = [t ValueForKeyPath(@"book.@avg.price");
XBLog(@"%@",value);