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);

 

posted @ 2015-06-16 20:31  daomul  阅读(569)  评论(0编辑  收藏  举报