zoukankan      html  css  js  c++  java
  • IOS KVC初识

    KVC是Cocoa touch的大招,大概原名叫key valued coding(键值编码),关于概念认识上的问题您可以Google下,有不少大牛解释的很专业,作为初学者的我,只想把学到的一点皮毛记个博客以备复习,也跟同样初学的你一起交流……

    新建一个控制台的项目,接着定义一个Boy类,有name和age两个属性,重写了description方法

    #import <Foundation/Foundation.h>
    
    @interface Boy : NSObject
    
    @property(nonatomic,copy) NSString* name;
    @property(nonatomic,assign) int age;
    
    @end
    
    -------------------------------------------------------------------------
    
    #import "Boy.h"
    
    @implementation Boy
    
    -(NSString *)description{
        return [NSString stringWithFormat:@"%@ 的年龄为 %d",self.name,self.age];
    }
    @end
    

     在main方法中实例化一个Boy对象,并为属性赋值,KVC之前我都是这么干的 

    #import <Foundation/Foundation.h>
    #import "Boy.h"
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            Boy *boy=[[Boy alloc] init];
            boy.name=@"luseike";
            boy.age=25;
            
            NSLog(@"%@",boy);
            
        }
        return 0;
    }
    

     打印结果:

    2014-06-10 21:44:39.245 KVC[13731:303] luseike 的年龄为 25

    对KVC的第一个认识:根据键值给对应的属性赋值

      Boy *boy=[[Boy alloc] init];
    //        boy.name=@"luseike";
    //        boy.age=25;
            [boy setValue:@"luseike" forKey:@"name"];
            [boy setValue:@28 forKey:@"age"];
            NSLog(@"%@",boy);
    

    对KVC的第二个认识:按键值路径取值

    在定义一个Boy对象,打印出两个Boy对象的name属性。对于这个需求而言,一般的做法是循环遍历Boy对象,打印每个Boy的name属性

         Boy *boy=[[Boy alloc] init];
            [boy setValue:@"luseike" forKey:@"name"];
            [boy setValue:@28 forKey:@"age"];
          
            Boy *boy2=[[Boy alloc] init];
            [boy2 setValue:@"jerry" forKey:@"name"];
            [boy2 setValue:@26 forKey:@"age"];
            
            NSArray *boys=@[boy,boy2];
            NSMutableArray *names=[NSMutableArray arrayWithCapacity:boys.count];
            for (Boy *boy in boys) {
                [names addObject:boy.name];
            }
            NSLog(@"%@",names);
    

     打印结果:

    2014-06-10 22:19:43.668 KVC[28885:303] (

        luseike,

        jerry

    )

    这种代码你看起来是不是觉得很蛋疼,繁琐且没有技术性,只要思路清晰就能写的出来,下面来瞧瞧KVC的牛逼之处吧

            Boy *boy=[[Boy alloc] init];
            [boy setValue:@"luseike" forKey:@"name"];
            [boy setValue:@28 forKey:@"age"];
          
            Boy *boy2=[[Boy alloc] init];
            [boy2 setValue:@"jerry" forKey:@"name"];
            [boy2 setValue:@26 forKey:@"age"];
            
            NSArray *boys=@[boy,boy2];
    //        NSMutableArray *names=[NSMutableArray arrayWithCapacity:boys.count];
    //        for (Boy *boy in boys) {
    //            [names addObject:boy.name];
    //        }
            NSLog(@"%@",[boys valueForKeyPath:@"name"]);
    

     打印结果不变!!!是不是有点意思了?valueForKeyPath字面意思就是根据key的路劲获取值,但是boys对象中明显没有name这一属性,KVC的特性就是会继续进入对象内部查找对应的属性,获取属性的值。

    对象的属性可以是对象,比如给我们的Boy弄一个girlFriend的属性,GirlFriend是一个对象,有girlName属性

      Boy *boy=[[Boy alloc] init];
            [boy setValue:@"luseike" forKey:@"name"];
            [boy setValue:@28 forKey:@"age"];
            GirlFriend *girl1=[[GirlFriend alloc] init];
            girl1.girlName=@"fengjie";
            boy.girlFriend=girl1;
          
            Boy *boy2=[[Boy alloc] init];
            [boy2 setValue:@"jerry" forKey:@"name"];
            [boy2 setValue:@26 forKey:@"age"];
            GirlFriend *girl2=[[GirlFriend alloc] init];
            girl2.girlName=@"furong";
            boy2.girlFriend=girl2;
            
            NSArray *boys=@[boy,boy2];
    NSLog(@"%@",[boys valueForKeyPath:@"girlFriend.girlName"]);
    
    
    输出结果为

    2014-06-10 22:34:33.716 KVC[35490:303] (

        fengjie,

        furong

    )

    通过NSLog(@"%@",[boys valueForKeyPath:@"girlFriend.girlName"]);这一句代码就搞定,拿到Boy对象的girlFriend属性的girlName属性的值,这属性点属性的形式,就是路径的含义,看到这里对KVC按路径取或设置属性值应该有点感觉了吧

    OC中还有个词叫KVO

    key valued observer 键值观察

    貌似是属性值发生变化时会进行通知,等学到这一点再回来补充吧

  • 相关阅读:
    回旋矩阵
    Python学习手记——了解Python
    My first Qt program
    10种使你的C程序更加高效的方法
    GCC指令
    缓冲思想
    Python学习手记——Whetting your appetite
    分割视图
    MSN Messenger 中的漏洞可能导致信息泄露 (838512)
    ASP.NET Popup Control
  • 原文地址:https://www.cnblogs.com/luseike/p/3780897.html
Copyright © 2011-2022 走看看