KVC
来源:互联网 发布:java split多个分隔符 编辑:程序博客网 时间:2024/06/16 21:39
KVC
1.1.基本概念
1.1.1.KVC 是 KeyValue Coding 的简称,它是一种可以直接通过字符串的名字( key ) 来访问类属性的机制。
1.1.2.使用该机制不需要调用存取方法和变量实例就可访问对象属性。
1.1.3.本质上讲,键-值编码定义了你的程序存取方法需要实现的样式及方法签名。
1.1.4.在应用程序中实现键-值编码兼容性是一项重要的设计原则。存取方法可以加强合适的数据封装,而键-值编码方法在多数情况下可简化程序代码。
1.1.5.键-值 编码方法在 Objective-C 非标准协议(类目) NSKeyValueCoding 中 被声明,默认的实现方法由 NSObject 提供。
1.1.6.键-值编码支持带有对象值的属性,同时也支持纯数值类型和结构。非对象参数和返回类型会被识别并自动封装/解封。
1.1.7.使用 KVC 为对象赋值或者取值时,需要知道准确的键值, 相比较点语法,KVC 是一种间接的传递方式,这种方式有利于对象解耦,让对象彼此之间的耦合度不会太高。
1.2.设置和访问
1.2.1.键/值编码中的基本调用包括 -valueForKey: 和 -setValue:forkey: 这两个方法,它们以字符串的形式向对象发送消息,字符串为属性名,即键:
1
2
3
4
Person *jack = [[Person alloc] init];
NSMutableString*name = [[NSMutableStringalloc] initWithFormat:@"jack"];
[jack setValue:name forKey:@"name"];//通过KVC设值
NSLog(@"Jack's name : %@", [jack valueForKey:@"name"]);//通过KVC取值
1.2.2.是否存在 setter、getter 方法, 若存在优先调用相应方法;若不存在,它将在内部查找名为 _key 或 key 的实例变量。
1.2.3.通过 KVC 设置对象,此对象会 retain。
1.2.4.通过 setValue:forKey: 设置对象的值,或通过 valueForKey 来获取对象的值时,如若对象的实例变量为基本数据类型时 ( char、int、float、BOOL ) ,我们需要对数据进行封装。
1.2.5.赋值语句 setValue:forKey: 是给对象当前的属性赋值,而 setValue:forKeyPath: 是按照对象的层级关系为其中的属性赋值
。 forKeyPath可以替代forKey,但是forKey不能替代forKeyPath。
1.2.6.setValuesForKeysWithDictionary: 可以从 plist 文件中读取对应的数据字典,对对象属性赋值。
1.3.批处理
1
2
3
4
5
6
7
8
//同时获取 Student 的 age 和 name
NSArray *keys = [NSArrayarrayWithObjects:@"name",@"age", nil];
NSDictionary*dict = [student dictionaryWithValuesForKeys:keys];
//同时设置 Student 的 age 和 name
NSArray *keys = [NSArrayarrayWithObjects:@"name",@"age", nil];
NSArray *values = [NSArrayarrayWithObjects:@"MJ", [NSNumbernumberWithInt:16], nil];
NSDictionary*dict = [NSDictionarydictionaryWithObjects:values forKeys:keys];
[student setValuesForKeysWithDictionary:dict];
1.4.路径
除了通过键设值或取值外, 键/值编码还支持指定路径设值或取值,像文件系统一样, 用“ . ”号隔开:
1
[book setValue:@"比尔"forKeyPath:@"author.name"];
1
NSNumber *price=[book valueForKeyPath:@"relativeBooks.price"]
1.4.数组的整体操作
如果向 NSArray 请求一个键值,它实际上会查询数组中的每个对象来查找这个键值, 然后将查询结果打包到另一个数组中并返回给你:
1
2
3
4
// 获取 Student 中所有 Book 的 name
NSArray *names = [student.books valueForKeyPath:@"name"]; 或者
NSArray *names = [student valueForKeyPath:@"books.name"];
//注意:不能在键路径中为数组添加索引,比如 @"books[0].name"
1.5.KVC的简单运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//count
NSString *count = [book valueForKeyPath:@"relativeBooks.@count"];
NSLog(@"count : %@", count);
//sum
NSString *sum = [book valueForKeyPath:@"relativeBooks.@sum._price"];
NSLog(@"sum : %@", sum);
//avg
NSString *avg = [book valueForKeyPath:@"relativeBooks.@avg._price"];
NSLog(@"avg : %@", avg);
//min
NSString *min = [book valueForKeyPath:@"relativeBooks.@min._price"];
NSLog(@"min : %@", min);
//max
NSString *max = [book valueForKeyPath:@"relativeBooks.@max._price"];
NSLog(@"max : %@", max);
- KVC
- Kvc....
- KVC
- KVC
- KVC
- KVC
- KVC
- kvc
- KVC
- KVC
- KVC
- KVC
- KVC
- KVC
- KVC
- KVC
- KVC
- kvc
- iOS之修改XCode新建文件自动生成注释
- JAVA命名规则
- Linux 挂载NTFS/FAT32(即 双系统下Linux访问windows磁盘)
- android sdk国内镜像
- DCT简单图像压缩的OpenCV实现
- KVC
- ARM体系结构
- Leetcode #30. Substring with Concatenation of All Words 连续子串查找 解题报告
- int与String之间的转换
- 删掉那些显示0Kb,却无法删除的文件(如rar_)
- MySQL学习(四)
- Word Reversal
- css3入门笔记
- 个人网站搭建第一天