结合之前的学习笔记以及參考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。知识点一直在变,仅仅是作为參考,以苹果官方文档为准~


十七、键值编码 KVC


关于KVC的知识点将通过下列样例来展开说明:

Person.h文件。Person类拥有name和age两个成员变量

 @interface Person : NSObject {
@private
NSString *_name;
NSInteger _age;
}
- (void)setAge:(NSInteger)age;
@end

Person.m实现了该方法

 @implementation Person

 - (NSString *)description {
return [NSString stringWithFormat:@"name:%@,age=%li", _name, _age];
} - (void)setAge:(NSInteger)age {
_age = age;
} @end

main.m

 Person *p = [[Person alloc] init];
// p->_name = @"Zane"; 不可訪问 //1.使用KVC给private的属性设置值
[p setValue:@"Zane" forKey:@"name"]; //2.通过KVC获取到属性值
NSString *name = [p valueForKey:@"_name"];
NSLog(@"%@", name); [p setValue:@21 forKey:@"age"];
NSLog(@"%@", p);

output:

2015-07-09 17:29:43.477 exercise_KVC[579:24344] Zane
2015-07-09 17:29:43.478 exercise_KVC[579:24344] name:Zane,age=21

1、键值编码(key-value coding):将表示对象包括的信息的字符串作为键值使用。来间接訪问该信息的方式。

基本上,仅仅要存在訪问器方法、声明属性或实例变量,就能够将其名字作为字符串訪问

(即使这个变量时@private私有的,也能訪问)


2、设置属性值:

 - (void)setValue:(id)value forKey:(NSString *)key; //已进行内存管理
[p setValue:@"Zane" forKey:@"name"];

a、假设此处name写错了。写成nama。nam1e等等。编译器不会报错,但会导致执行崩溃

b、value为id类型,因此假设是基本数据类型须要进行包装

获取属性值

 - (id)valueForKey:(NSString *)key;
NSString *name = [p valueForKey:@"_name"];

假设人还拥有一条狗,以@class的方式加在Person.h中。狗有dogName属性,那么能够指定路径设置

[p setValue:@"wangwang" forKeyPath:@"dog._dogname"];
NSLog(@"%@",[p valueForKeyPath:@"dog._dogname"])
- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

3、缺点

(1)破坏了面向对象的封装性

(2)编译器不会对设置的keyValue进行错误检查。

(3)须要先对字符串进行解析,执行效率低于set和get方法


4、其它说明

(1)使用KVC设置属性。优先去当前类中查找是否有对应的set方法,假设有使用set方法设置,若无则找到属性设置

要调用仅仅能写age不能写_age

比如样例中的

[p setValue:@21 forKey:@"age"];
[p setValue:@21 forKey:@"_age"];

能够在age的set方法实现处设置断点。会发现,假设写_age则不调用set方法

(2)一对多的关系

一般先打包成NSArray,再通过setValue方法,作为value赋值。

訪问的时候通过路径訪问valueForKeyPath訪问

(3)数值计算

在上述样例中为Person添加book成员变量;

而且Dog.h拥有成员变量dogage

 @interface Dog : NSObject
{
int _dogage;
}
- (instancetype)initWithAge:(int)age; //并实现
@end

main.m

 Dog* dog1 = [[Dog alloc] initWithAge:20];
Dog* dog2 = [[Dog alloc] initWithAge:30];
Dog* dog3 = [[Dog alloc] initWithAge:10]; NSArray *array = [NSArray arrayWithObjects:dog1,dog2,dog3, nil];
[p setValue:array forKey:@"dog"]; //前面已定义 NSLog(@"%@",[p valueForKeyPath:@"dog.@count"]); //dog数量
NSLog(@"%@",[p valueForKeyPath:@"dog.@sum._dogage"]); //全部dogage总和
NSLog(@"%@",[p valueForKeyPath:@"dog.@avg._dogage"]); //平均值
NSLog(@"%@",[p valueForKeyPath:@"dog.@min._dogage"]); //最小值
NSLog(@"%@",[p valueForKeyPath:@"dog.@max._dogage"]); //最大值

output:

2015-07-09 17:29:43.479 exercise_KVC[579:24344] 3
2015-07-09 17:29:43.479 exercise_KVC[579:24344] 60
2015-07-09 17:29:43.480 exercise_KVC[579:24344] 20
2015-07-09 17:29:43.480 exercise_KVC[579:24344] 10
2015-07-09 17:29:43.480 exercise_KVC[579:24344] 30

Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础的更多相关文章

  1. iOS - KVC 键值编码

    1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...

  2. KVC - 键值编码

    [基本概念] 1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性. 2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明, ...

  3. Property属性, KVC键值编码OC…

    1.属性:帮你自动生成setter 和 getter 方法      属性的声明:(写在.h中)      格式: @property 数据类型 属性名      属性的实现:(写在.m中)      ...

  4. 使用KVC键值编码

    掌握KVC从不使用setter.getter.点语法开始. ----- 前言 对象的内部状态是由属性进行封装的.访问对象属性的方式平时在开发过程中用得最多的是getter方法和点语法.键值编程KVC也 ...

  5. 路径(keyPath)、键值编码(KVC)和键值观察(KVO)

    键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...

  6. ios中键值编码kvc和键值监听kvo的特性及详解

    总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  ...

  7. 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)

    键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...

  8. 《苹果开发之Cocoa编程》键-值编码和键-值观察

    一.KVC 键-值编码(Key - Value Coding, KVC)是通过变量名的读取和设置变量值的一种方法,将字符串的变量名作为key来引用.NSObject定义了两个方法(KVC方法)用于变量 ...

  9. kvc(键-值编码)

    kvc(键-值编码) { NSString *_name; Author *_author; NSArray *_kvcArray; float price;} //kvc,setValue 的设的值 ...

随机推荐

  1. HDU 3507 Print Article(斜率优化推导)

    $dp$,斜率优化. 第一次做斜率优化的题目,看了一些题解,自己总结一下. 这题是说有$n$个数字,可以切成任意段,每一段的费用是这一段数字的和平方加上$M$.问最小费用是多少. 设$dp[i]$为$ ...

  2. Scala 实现快速排序和归并排序

    def quickSort1(array: Array[Int]): Array[Int] = { def swap(x: Int, y: Int): Unit = { val tmp = array ...

  3. golang笔记:cookie

    在同一个问题上栽了两次,以后碰到cookie出问题多半都是因为这个. Request.Cookie(name)取Cookie的时候,返回值只有name和value cookie.go cookies ...

  4. 线段树+Dfs序【CF620E】New Year Tree

    Description 你有一棵以1为根的有根树,有n个点,每个节点初始有一个颜色c[i]. 有两种操作: 1 v c 将以v为根的子树中所有点颜色更改为c 2 v 查询以v为根的子树中的节点有多少种 ...

  5. 23、Django实战第23天:视频播放页面

    打开素材course-play.html,会发现播放页面处了包含播放器,其他和“章节”页面一样. 1.把course-play.html复制到template目录下 2.把下面两段代码拷贝出来 < ...

  6. C#外围工具资源

    1.MATH.NET数学库:可以用于 矩阵计算 方程求根 插值拟合 ... 2.

  7. hibernate中session的线程安全问题

    Hibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在Hibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Sessio ...

  8. [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)

    3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2438  Solved: 763[Submit][ ...

  9. [BZOJ 4057] Kingdoms

    Link: BZOJ 4057 传送门 Solution: 一道比较基础的状压DP 看到$n<=20$,状态转移与顺序相关,就可以开心地状压了 1表示破产,0表示未破产,不断扩展破产的集合即可 ...

  10. POJ 3494 Largest Submatrix of All 1’s(最大子图形)

    [题目链接] http://poj.org/problem?id=3494 [题目大意] 在01矩阵中求最大全1子矩形 [题解] 在处理每个点的时候,继承上一个点等高度下的左右最大扩展, 计算在该层的 ...