Objective - C 中的KVC(一)(视图、便携、易懂、原创纯手打 定制版)

KVC的使用



1、KVC 全称 key valued coding 键值编码

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性.JAVA,C#都有这个机制。ObjC也有,所以你根部不必进行任何操作就可以进行属性的动态读写,就是KVC。

KVC的操作方法由NSKeyValueCoding提供,而他是NSObject的类别,也就是说ObjC中几乎所有的对象都支持KVC操作。

2、常用方法

获取值的方法

valueForKey:,传入NSString属性的名字。

valueForKeyPath:,传入NSString属性的路径,xx.xx形式。

valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。

修改值的方法

setValue:forKey:

setValue:forKeyPath:

setValue:forUndefinedKey:

 setValue:forKey的搜索过程:

1. 首先搜索set<Key>:方法

如果成员用@property,@synthsize处理,因为@synthsize告诉编译器自动生成set<Key>:格式的setter方法,所以这种情况下会直接搜索到。

注意:这里的<Key>是指成员名,而且首字母大写。

2. 上面的setter方法没有找到,如果类方法accessInstanceVariablesDirectly返回YES(注:这是NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)。

那么按_<key>,_is<Key>,<key>,is<key>的顺序搜索成员名。

3. 如果还是没有找到设置成员的值,就会调用setValue:forUndefinedKey:。

4. 如果没有重写setValue:forUndefinedKey程序会马上崩溃。

注意:

1、使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换。

2、KVC可以访问成员变量,无论是否提供getter/setter方法,无论可见性是怎样,是否有readonly修饰。

setValue:forUndefinedKey与valueForUndefinedKey的应用

KVC的主要用途无非是ORM映射,就是将dictionary转换成model,但有些服务器返回的字段有可能是oc的关键字比如‘id’,’description’等。如上代码举得id的例子,我们无法让@property后面key值为id,于是使用大写的ID代替,KVC是区分大小写的我们不用担心。这时我们只需在setValue:forUndefinedKey把id的key值赋值给ID的key值,就可以避免关键字的尴尬。

3、dict <->model 互转

字典转模型

[self setValuesForKeysWithDictionary:dict];

模型转字典

[p dictionaryWithValuesForKeys:array];

4、KVC集合

NSArray/NSSet等都支持KVC

[array valueForKeyPath:@"dog.name"];

5、使用KVC计算属性

格式为:[p valueForKeyPath:@"Left keypath部分[email protected]部分.Right keypath部分”];

Left keypath部分:需要操作对象路径。

Collectionoperator部分:通过@符号确定使用的集合操作。

Right keypath部分:需要进行集合操作的属性。

举例:[p valueForKeyPath:@"[email protected]"];

@avg:平均值

@count:总数

@max:最大

@min:最小

@sum:总数

时间: 2024-12-22 22:45:30

Objective - C 中的KVC(一)(视图、便携、易懂、原创纯手打 定制版)的相关文章

【Swift】swift中使用kvc赋值的时候,注意事项

swift中使用kvc赋值的时候.假如给基础数据类型赋值,必须先给基础数据类型的变量一个初始值. 否则将会报错. var id : Int = 0 setValue(dict["id"], forKey: "id")

Oracle中关联表的视图创建

这几天的工作基本上没有了比较的新的技术点,就是反反复复的修改需求,修改Bug--当然,也是到了此刻,自己猜觉得在一个庞大的项目中,需求分析的重要性,以及需求说明书的重要性.我们在需求模糊.文档缺乏的条件下,反复修改功能已经成了家常便饭,今天领导说这个功能应该这样,我们就要立刻改到这样,第二天领导说又要原来的那样,我们只能再改回去了--有时候,我们也曾调侃自己是典型的面向领导开发-- 今天没有什么比较新的技术点来总结了,自己回顾了一下,这几天的工作,发现在关联表中创建视图的时候对于连接不是特别熟悉

BPMN规范中的三种视图

诚如UML建模所带来的好处一样,对流程建模规范BPMN也同样带来了类似好处,此外BPMN还通过一套统一的建模.执行模型缩小了业务人员和开发人员之间的一道鸿沟,而其终极目标也包含消除这道鸿沟.亦如UML用十四种图来描述一个系统的不同方面,对于BPM而言,BPMN提供了三种基本类型的流程视图,而这也成为不同角色之间交流业务流程.创建端到端的业务流程的基础.本文将简单描述这几种流程视图_--协作视图(Collaboration).流程视图(process).编排视图(choreography). 协作

IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

//代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtton点击监控事件方法-(void)event{};视图的跳转就在这个方法中实现(注意:这个button不在视图控制器里面,就算导了相关头文件,也不能跳转,所以只能通过代理方法,或者代码块等,在这个button(在自定义控件空,非视图控制器)方法中调用相关方法,在视图控制器中去实现) 代理实现方法: 在

2014-07-29 浅谈MVC框架中Razor与ASPX视图引擎

今天是在吾索实习的第15天.随着准备工作的完善,我们小组将逐步开始手机端BBS的开发,而且我们将计划使用MVC框架进行该系统的开发.虽然我们对MVC框架并不是非常熟悉,或许这会降低我们开发该系统的效率,但是我们可以通过边学边做的方式来实现其开发的.这不仅便于我们日后对系统的管理与维护,而且还给我们带来一个学习的动力与实践的地方. 但我们在创建一个基于MVC框架的项目时,就遇到一些问题了.那就是MVC的视图引擎是有两种的,一种是Razor,会以cshtml后缀的文件作为视图文件:另一种是ASPX,

objective C中的字符串(三)

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/7343561 objective C中的字符串操作 在OC中创建字符串时,一般不使用C的方法,因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,下面举几个例子: 1.创建: 直接利用等号赋值 NSString *

IOS开发中UITableView(表视图)的性能优化及自定义Cell

IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITableView实现的.UITableView这个控件中的列表的每一行是一个cell,当UITableView中cell数量特别大的时候,由于每次都需要alloc分配内存并初始化,会导致app运行不流畅,所以可以使用苹果提供的几个方法进行优化,我把这个过程记录下来供自己以后查阅. 当然,既然说到优化,那我们

SQL Server 中的跨库视图

SQL Server 中的跨库视图 在一个SQL中,有多个数据库,A.B.C,在使用C为连接库中,现在要查询A中的表T1. 那么,在C中建创视图(A_T1). SELECT *FROM A.dbo.T1 这样就当本地表使用了.

EBS OAF开发中实体对象和视图对象的属性设置器

(版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 源文: Home > Oracle Application Framework Documentation Set, Release 12.2 > Oracle Application Framework Developer's Guide > Chapter 5: Implementing Server-Side Features > Entity Object and Vi