Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础
结合之前的学习笔记以及參考《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开发基础的更多相关文章
- iOS - KVC 键值编码
1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...
- KVC - 键值编码
[基本概念] 1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性. 2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明, ...
- Property属性, KVC键值编码OC…
1.属性:帮你自动生成setter 和 getter 方法 属性的声明:(写在.h中) 格式: @property 数据类型 属性名 属性的实现:(写在.m中) ...
- 使用KVC键值编码
掌握KVC从不使用setter.getter.点语法开始. ----- 前言 对象的内部状态是由属性进行封装的.访问对象属性的方式平时在开发过程中用得最多的是getter方法和点语法.键值编程KVC也 ...
- 路径(keyPath)、键值编码(KVC)和键值观察(KVO)
键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...
- ios中键值编码kvc和键值监听kvo的特性及详解
总结: kvc键值编码 1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性) 2. 如果方法属性的关键字和需要数据中的关键字相同的话 ...
- 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)
键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...
- 《苹果开发之Cocoa编程》键-值编码和键-值观察
一.KVC 键-值编码(Key - Value Coding, KVC)是通过变量名的读取和设置变量值的一种方法,将字符串的变量名作为key来引用.NSObject定义了两个方法(KVC方法)用于变量 ...
- kvc(键-值编码)
kvc(键-值编码) { NSString *_name; Author *_author; NSArray *_kvcArray; float price;} //kvc,setValue 的设的值 ...
随机推荐
- 【转】jenkins插件pipeline使用介绍
摘要: pipeline字面意思就是流水线,将很多步骤按顺序排列好,做完一个执行下一个.下面简单介绍下如何使用该插件帮我们完成一些流水线型的任务 pipeline字面意思就是流水线,将很多步骤按顺序排 ...
- Mathematica作图
第2讲 在Mathematica中作图 一个较强的符号计算系统均有很好的绘图功能,Mathematica也不例外,Mathematica 拥有非常强大的绘图功能.并且提供了一大批基本数学函数的图 ...
- sqlmap的小试牛刀
这次算是一次用sqlmap的例子,写的很水. 目的:通过工具扫描到了后台的数据库的地址(如下图),想通过sqlmap找到数据库的用户和密码进入到数据库(首先可以尝试一下root:root一般都是这个情 ...
- flutter 频道切换
https://github.com/flutter/flutter/wiki/Flutter-build-release-channels 频道说明页 https://flutter.dev/doc ...
- HDU 1426 Sudoku Killer【DFS 数独】
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品— ...
- 折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…
Description 给n个数,从中任意选出一些数,使这些数能分成和相等的两组. 求有多少种选数的方案. Input 第\(1\)行:一个整数\(N\) 第\(2\)到\(N+1\)行,包含一个整数 ...
- cogs p服务点设置
5. P服务点设置 ★★ 输入文件:djsc.in 输出文件:djsc.out 简单对比时间限制:2 s 内存限制:128 MB 问题描述为了进一步普及九年义务教育,政府要在某乡镇建立 ...
- HDU 2256 Problem of Precision (矩阵快速幂)(推算)
Problem of Precision Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- leetcode171 Excel Sheet Column Number
题意: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 思路:找规律,挺简单的···可是小地方错了一些搞了半天 ...
- [BZOJ2753]滑雪与时间胶囊
第一问直接把可以走的边连起来bfs一遍即可 第二问可以用类似kruskal的方法,只不过排序的依据应该变为第一关键字为终点高度(从大到小),第二关键字为边权(从小到大),只排序可以走的边 因为同样高度 ...