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 键值观察

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

  • 相关阅读:
    leetcode Convert Sorted List to Binary Search Tree
    leetcode Convert Sorted Array to Binary Search Tree
    leetcode Binary Tree Level Order Traversal II
    leetcode Construct Binary Tree from Preorder and Inorder Traversal
    leetcode[105] Construct Binary Tree from Inorder and Postorder Traversal
    证明中序遍历O(n)
    leetcode Maximum Depth of Binary Tree
    限制 button 在 3 秒内不可重复点击
    HTML 和 CSS 画三角形和画多边行基本原理及实践
    在线前端 JS 或 HTML 或 CSS 编写 Demo 处 JSbin 与 jsFiddle 比较
  • 原文地址:https://www.cnblogs.com/luseike/p/3780897.html
Copyright © 2011-2022 走看看