zoukankan      html  css  js  c++  java
  • KVC

    【基本概念】

    1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性。

    2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。

    3.键值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封。

    【键值访问】

      键值编码中的基本调用包括-valueForKey: 和 -setValue:forkey: 这两个方法,它们以字符串的形式向对象发送消息字符串是我们关注属性的关键。下面是我演示的一个简单的例子:

    (1)新建一个Book类,在头文件中加入如下属性:

    1. @property(strong,nonatomic) NSString *name;  


    (2)在main.m中实现如下:

    1. #import <Foundation/Foundation.h>  
    2. #import "Book.h"  
    3.   
    4. int main(int argc, const charchar * argv[]) {  
    5.   @autoreleasepool {  
    6.   
    7.       
    8.     Book *book = [[Book alloc] init];  
    9.     [book setValue:@"老人与海" forKey:@"name"];  
    10.       
    11.     NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);  
    12.       
    13.       
    14.       
    15.   }  
    16.     return 0;  
    17. }  


    (3)输出结果如下:

    是否存在setter、getter方法,如果不存在,他将在内部查找名为_key或key的实例变量。通过KVC,可以获取不存在getter方法的对象值,无需通过对象指针直接访问。这里我们需要注意,当我们通过setValue:forKey:设置对象的值,或通过valueForKey来获取对象的值时,若对象的实例变量为基本数据类型时(char,int,float,BOOL),我们需要对数据进行封装。

    【路径访问】

         除了通过键设置外,键值编码还支持指定路径,像文件系统一样。用“点”号隔开。下面我给大家演示一个程序:

    (1)新建一个Book类,在.h头文件中如下:

    1. #import <Foundation/Foundation.h>  
    2. #import "Author.h"  
    3.   
    4. @interface Book : NSObject  
    5.   
    6. @property(strong,nonatomic) NSString *name;  
    7.   
    8. @property(strong,nonatomic) Author *author;  
    9.   
    10. @end  


    (2)新建一个Author类,在.h头文件中如下:

    1. #import <Foundation/Foundation.h>  
    2.   
    3. @interface Author : NSObject  
    4.   
    5. @property(strong,nonatomic) NSString *authorName;  
    6.   
    7. @end  


    (3)在main.m文件中实现如下:

    1. #import <Foundation/Foundation.h>  
    2. #import "Book.h"  
    3. //这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。  
    4.   
    5. int main(int argc, const charchar * argv[]) {  
    6.   @autoreleasepool {  
    7.   
    8.       
    9.     Book *book = [[Book alloc] init];  
    10.     [book setValue:@"老人与海" forKey:@"name"];  
    11.       
    12.       
    13.     Author *author = [[Author alloc] init];  
    14.     [author setValue:@"海明威" forKey:@"authorName"];  
    15.       
    16.       
    17.     [book setValue:author forKey:@"author"];  
    18.       
    19.     NSLog(@"这本书的名字是:%@",[book valueForKey:@"name"]);  
    20.     NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);  
    21.       
    22.       
    23.     [book setValue:@"是海明威吗?" forKeyPath:@"author.authorName"];  
    24.     NSLog(@"这本书的作者是:%@",[book valueForKeyPath:@"author.authorName"]);  
    25.   
    26.       
    27.   }  
    28.     return 0;  
    29. }  


    (4)输出结果如下:

    【KVC的简单运算】

         此外,还可以应用一些字符做简单运算。sum,min,max,avg,count

    【基本数据类型的封装】

    KVC中的setValue: forKey: 方法和valueForKey:方法不能直接对基本数据类型进行操作,需要进行包装,示例代码如下:

      1. #import <Foundation/Foundation.h>  
      2. #import "Book.h"  
      3. //这里不再需要引入Author.h头文件了,该头文件已经在Book.h中引入了。  
      4.   
      5. int main(int argc, const charchar * argv[]) {  
      6.   @autoreleasepool {  
      7.   
      8.       
      9.     Book *book = [[Book alloc] init];  
      10.     [book setValue:[[NSNumber alloc] initWithFloat:12.8] forKey:@"price"];//要在这里进行包装;  
      11.   
      12.     NSLog(@"书本的价格是:%@",[book valueForKey:@"price"]);  
      13.       
      14.   }  
      15.     return 0;  
      16. }  
  • 相关阅读:
    CAS SSO单点登录框架学习
    [精华][推荐]CAS SSO单点登录服务端客户端学习
    [精华][推荐]CAS SSO单点登录服务端客户端实例
    CAS SSO单点登录实例
    微服务、分布式、云架构构建电子商务平台
    java分布式电子商务云平台b2b b2c o2o需要准备哪些技术??
    C语言 全局变量、静态全局变量、局部变量、静态局部变量
    使用Shader制作loading旋转动画
    PureMVC 官方文档翻译(一)
    极致21点开发DAY4
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4923711.html
Copyright © 2011-2022 走看看