objective-c KVC

KVC(KeyValueCoding)的基本概念

  KVC是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可以访问对象属性

  KVC方法在obj-c非正式协议NSKeyValue’Coding中被声明,默认的实现方法由NSObject提供

  KVC支持带有对象值的属性,同时也支持纯数值类型和结构,非对象参数和返回类型会背识别并自动封装、解封

设置和访问(键值访问)

  KVC中的基本调用包括- (id)valueForKey:(NSString *)key;和- (void)setValue:(id)value forKey:(NSString *)key;这两个方法,他们以字符串的形式向对象发送消息,字符串是我们关注属性的关键。

  如果不存在set和get方法,它将在内部查找名为key或_key的示例变量(name或_name)。通过KVC可以获取不存在get方法的对象值,无需通过对象指针直接访问。

  在设置对象的值时,若对象的实例变量为基本数据类型(char、int、float、BOOL),需要对数据进行封装。

路径访问

  KVC还支持路径访问,像文件系统一样,用 “.” 号分割。

一对多的访问

  如果向NSArray请求一个键值,它实际上会查询数组中的每个对象来查找这个键值,然后将查询结果打包到另一个数组中并返回给你

KVC的简单运算

  可以利用KVC做一些简单运算,sum、min、max、avg、count

  运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber

 

 

 

示例代码:

Book.h

#import <Foundation/Foundation.h>
#import "Author.h"
@interface Book : NSObject
{
    NSString *name;
    Author *author;
    NSArray *other;
    
}

@end

Book.m

#import "Book.h"

@implementation Book

@end

Author.h

#import <Foundation/Foundation.h>

@interface Author : NSObject

@property(nonatomic,copy)NSString *name;

@end

Author.m

#import "Author.h"

@implementation Author

@end

main.m

#import <Foundation/Foundation.h>
#import "Book.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        // insert code here...
        NSLog(@"Hello, World!");
        
        //键值访问
        Book *book = [[Book alloc]init];
        [book setValue:@"三体2:黑暗森林" forKey:@"name"];//设置
        NSLog(@"%@",[book valueForKey:@"name"]);//访问
        
        //路径访问
        Author *author = [[Author alloc]init];
        author.name = @"刘慈欣";
        [book setValue:author forKey:@"author"];
        NSLog(@"%@",[book valueForKeyPath:@"author.name"]);//此处的点是路径分割,不是点语法
        
        //一对多
        NSMutableArray *arr = [[NSMutableArray alloc]init];
        for (int i = 0; i<3; i++) {
            Book *book = [[Book alloc]init];
            NSString *name = [NSString stringWithFormat:@"other_%d",i];
            [book setValue:name forKey:@"name"];
            [arr addObject:book];
        }
        [book setValue:arr forKey:@"other"];
        NSLog(@"%@",[book valueForKeyPath:@"other.name"]);
        
        NSArray *arr1 = [arr valueForKeyPath:@"name"];
        NSLog(@"%@",arr1);
        
        //KVC的简单运算
        NSLog(@"%@",[book valueForKeyPath:@"other.name.@count"]);//查看个数
        /*
         [XXX valueForKeyPath:@"路径key.@sum.要进行运算的key"]//在运算中,先写入第一个路径,在最后要运算的属性前加@sum、@min等等,
                                    运算的字段必须是数值类型NSNumber或者基本数据类型,计算的结果是NSNumber
*/ } return 0; }

 运行结果:

2014-01-02 13:14:45.219 KVC[1387:303] Hello, World!
2014-01-02 13:14:45.221 KVC[1387:303] 三体2:黑暗森林
2014-01-02 13:14:45.221 KVC[1387:303] 刘慈欣
2014-01-02 13:14:45.221 KVC[1387:303] (
    "other_0",
    "other_1",
    "other_2"
)
2014-01-02 13:14:45.222 KVC[1387:303] (
    "other_0",
    "other_1",
    "other_2"
)
2014-01-02 13:14:45.222 KVC[1387:303] 3
原文地址:https://www.cnblogs.com/mo-shou/p/3501710.html