博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
objective-c KVC
阅读量:5245 次
发布时间:2019-06-14

本文共 2844 字,大约阅读时间需要 9 分钟。

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 
#import "Author.h"@interface Book : NSObject{ NSString *name; Author *author; NSArray *other; }@end

Book.m

#import "Book.h"@implementation Book@end

Author.h

#import 
@interface Author : NSObject@property(nonatomic,copy)NSString *name;@end

Author.m

#import "Author.h"@implementation Author@end

main.m

#import 
#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

你可能感兴趣的文章
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>
Android弹出框的学习
查看>>
现代程序设计 作业1
查看>>
在android开发中添加外挂字体
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
多线程实现资源共享的问题学习与总结
查看>>
Learning-Python【26】:反射及内置方法
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
stap-prep 需要安装那些内核符号
查看>>
2016寒假自学笔记
查看>>