Objective-C:KVC机制
KVC:key value coding 键值对的编码
@interface NSObject(NSKeyValueCoding)
//默认返回yes,如果没有setter方法,按_key,is_key,key,iskey的顺序搜索成员名
+ (BOOL)accessInstanceVariablesDirectly;
//通过属性的字符串键获取值
- (id)valueForKey:(NSString *)key;
//通过属性的字符串键设置值
-(void)setValue:(id)value forKey:(NSString*)key;
//通过属性路径字符串键获取值(格式:@“_xx._xx")
- (id)valueForKeyPath:(NSString *)keyPath;
//通过属性路径字符串键设置属性值(格式:@“_xx._xx")
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
//通过属性字符串键检查值的正确性
- (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
//通过属性路径字符串键检查值的正确性
- (BOOL)validateValue:(inout id *)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError**)outError;
//通过属性数组键返回可变数组(有序一对多的关系:NSArray)
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
//通过属性数组路径键返回可变数组(有序一对多的关系:NSArray)
- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
//通过属性集合键返回可变集合(无序一对多的关系:NSSet)
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
//通过属性集合路径键返回可变集合(无序一对多的关系:NSSet)
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
//通过数组(多个值)键获取字典值
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
//通过字典键设置多个值(数组)
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
//通过属性字符串键返回可变有序集合
- (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key;
//通过属性路径字符串键返回可变有序集合
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath;
//当key不存在时,会处理异常,即会调用下面这两个方法(例如判断key==id时可以设取值)
- (id)valueForUndefinedKey:(NSString *)key;
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
//为nil设置一个合理的值,对于标量来说,多数情况下合理值为0
- (void)setNilValueForKey:(NSString *)key;
@end
@interface NSArray(NSKeyValueCoding) //不可变数组
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end
@interface NSDictionary(NSKeyValueCoding) //不可变字典
- (id)valueForKey:(NSString *)key;
@end
@interface NSMutableDictionary(NSKeyValueCoding)//可变字典
- (void)setValue:(id)value forKey:(NSString *)key;
@end
@interface NSOrderedSet(NSKeyValueCoding) //有序set集合
- (id)valueForKey:(NSString *)key ;
- (void)setValue:(id)value forKey:(NSString *)key ;
@end
@interface NSSet(NSKeyValueCoding) //无序set集合
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end
具体的演示实例如下:
1、通过键访问属性:
首先创建一个Person类,perosn.h中声明person对象的属性姓名name,年龄age
#import <Foundation/Foundation.h> @interface Person : NSObject
{
NSString *_name; //姓名
NSInteger _age; //年龄
}
@end
person.m中重写输出方法-(NSString*)description
#import "Person.h" @implementation Person
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld",_name,_age];
}
@end
然后再main方法中设置属值性和取出属性值
#import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool
{
//使用KVC来存取对象中的数据成员
Person *person = [[Person alloc]init]; [person setValue:@"Tom" forKey:@"_name"];
[person setValue:@ forKey:@"_age"]; NSLog(@"%@",person);
}
return ;
}
打印结果如下:
-- ::36.736 Person[:] name:Tom,age:
Program ended with exit code:
2、当对象中的数据成员如果是另一个对象,可以使用keyPath的键路径的形式访问这个对象中的数据成员
首先创建一个学生类Student,在Student.h中声明学生姓名、年龄、课程对象属性
#import <Foundation/Foundation.h> @class Course;
@interface Student : NSObject
{
NSString *_name;
NSInteger _age;
Course *_course; //将课程对象定义为学生对象的属性
}
@end
然后再创建一个课程类Course,在Course.h中声明课程名属性
#import <Foundation/Foundation.h> @interface Course : NSObject
{
NSString *_CourseName;
CGFloat _score; //分数
}
@end
最后再main函数中实现KVC机制
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Course.h" int main(int argc, const char * argv[]) {
@autoreleasepool
{ //创建学生对象
Student *stu = [[Student alloc]init]; //设置stu属性值
[stu setValue:@"Tom" forKey:@"_name"];
[stu setValue:@ forKey:@"_age"]; //通过键取出属性值
NSString *name = [stu valueForKey:@"_name"];
NSInteger age = [[stu valueForKey:@"_age"] integerValue]; NSLog(@"name:%@,age:%ld",name,age); //创建科目对象
Course *course = [[Course alloc]init]; //通过键设置course属性值
[course setValue:@"Chinese" forKey:@"_CourseName"];
[course setValue:@99.3 forKey:@"_score"];
[stu setValue:course forKey:@"_course"]; //通过键路径取出course属性值
NSString *courseName = [stu valueForKeyPath:@"_course._CourseName"];
CGFloat score = [[stu valueForKeyPath:@"_course._score"]floatValue]; NSLog(@"courseName:%@,score:%.1lf",courseName,score); //也可以使用键路径设置和取值
[stu setValue:@"English" forKeyPath:@"_course._CourseName"];
courseName = [stu valueForKeyPath:@"_course._CourseName"]; //将基本数据类型封装成字符串
[stu setValue:@"92.5" forKeyPath:@"_course._score"];
NSString *score2 = [stu valueForKeyPath:@"_course._score"]; NSLog(@"courseName:%@,score2:%@",courseName,score2);
}
return ;
}
打印结果如下:
-- ::38.412 KVC-键路径[:] name:Tom,age:
-- ::38.414 KVC-键路径[:] courseName:Chinese,score:99.3
-- ::38.414 KVC-键路径[:] courseName:English,score2:92.5
Program ended with exit code:
3、使用KVC操作数组:当对象中有一个数组属性时,也可以使用KVC机制访问数组中的数据
首先创建一个动物类Animal
在anmial.h文件中声明属性
#import <Foundation/Foundation.h> @interface Animal : NSObject
{
NSString *_name; //名字
NSString *_food; //食物
NSArray *_otherAnimal; //其他动物数组
}
@end
在animal.m中重写输出方法-(void)description
#import "Animal.h" @implementation Animal
-(NSString*)description
{
return [NSString stringWithFormat:@"name:%@,food:%@",_name,_food];
}
@end
在main主函数中进行KVC的操作
#import <Foundation/Foundation.h>
#import "Animal.h" int main(int argc, const char * argv[]) {
@autoreleasepool { //创建动物对象
Animal *animal = [[Animal alloc]init]; //设置属性
[animal setValue:@"Cat" forKey:@"_name"];
[animal setValue:@"fish" forKey:@"_food"]; //取出属性
NSString *animalName = [animal valueForKey:@"_name"];
NSString *foodName = [animal valueForKey:@"_food"]; NSLog(@"animalName:%@,foodName:%@",animalName,foodName); //其他的动物
Animal *animal2 = [[Animal alloc]init];
Animal *animal3 = [[Animal alloc]init];
Animal *animal4 = [[Animal alloc]init]; [animal2 setValue:@"dog" forKey:@"_name"];
[animal3 setValue:@"rabbit" forKey:@"_name"];
[animal4 setValue:@"pannada" forKey:@"_name"]; [animal2 setValue:@"gone" forKey:@"_food"];
[animal3 setValue:@"grass" forKey:@"_food"];
[animal4 setValue:@"bamboo" forKey:@"_food"]; NSArray *array = @[animal2,animal3,animal4]; [animal setValue:array forKey:@"_otherAnimal"]; //取出其他动物的属性
NSLog(@"%@",[animal valueForKey:@"_otherAnimal"]); //打印所有动物的所有信息
NSLog(@"%@",[animal valueForKeyPath:@"_otherAnimal.name"]);//输出所有动物的名字
NSLog(@"%@",[animal valueForKeyPath:@"_otherAnimal._food"]);//输出所有动物的食物
}
return ;
}
打印结果如下:
-- ::30.375 KVC-操作数组[:] animalName:Cat,foodName:fish
-- ::30.377 KVC-操作数组[:] (
"name:dog,food:gone",
"name:rabbit,food:grass",
"name:pannada,food:bamboo"
)
-- ::30.377 KVC-操作数组[:] (
dog,
rabbit,
pannada
)
-- ::30.377 KVC-操作数组[:] (
gone,
grass,
bamboo
)
Program ended with exit code:
Objective-C:KVC机制的更多相关文章
- ios使用kvc机制简化对json的解析
在 ios开发中,我们经常需要对服务器的传回来的json进行解析,特别是对哪些字段特别多的就会又烦躁的情绪.tmd都是一样的东西,要为每个property赋值,真是累人啊.举个简单的例子吧.服务器会过 ...
- iOS编程——Objective-C KVO/KVC机制[转]
这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结构.条理做了更清晰的调整.先找了段代码,理解下,网上看到最多的一段的关于KVC的代码 先上代码 1. 1 ...
- iOS编程——Objective-C KVO/KVC机制
来源:http://blog.sina.com.cn/s/blog_b0c59541010151s0.html 这两天在看和这个相关的的内容,全部推翻重写一个版本,这是公司内做技术分享的文档总结,对结 ...
- IOS之KVC机制(Object-C篇)
开发环境:xcode7 一.KVC概述 1.KVC是KeyValueCoding的简称,它是一种可以直接通过类属性的名字来作key,再绑定key的值来访问类属性的机制,而不再通过利用@property ...
- KVC该机制
KVC该机制 KVC是cocoa的大招,用来间接获取或者改动对象属性的方式. 一.KVC的作用: KVC大招之中的一个: [self setValuesForKeysWithDictionary:di ...
- IOS学习之初识KVC
什么是kvc? kvc (key-value coding )键值编码,是ios 提供的一种通过key间接的来访问对象属性的一直方式. 哪些类支持kvc操作? kvc的操作方法由NSKeyValueC ...
- KVC&&&KVO
KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...
- KVC与KVO的实现原理
|KVC的用法 1.KVC既键值编码(Key Value Coding),基于NSKeyValueCoding协议,它是以字符串的形式来操作对象的成员变量,也就是通过字符串key来指定要操作的成员变量 ...
- KVO/KVC 实现机理分析
来源:http://blog.csdn.net/dqjyong/article/details/7672865 Objective-C里面的Key-Value Observing (KVO)机制,非常 ...
随机推荐
- linux命令(49):wget命令
Linux wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器.如果我们使用虚拟主机,处理这样的 ...
- linux命令(39):ss命令
ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...
- [转] Socket心跳包异常检测的C语言实现,服务器与客户端代码案例
转载自:zxh2075的专栏 在Socket心跳机制中,心跳包可以由服务器发送给客户端,也可以由客户端发送给服务器,不过比较起来,前者开销可能较大.本文实现的是由客户端给服务器发送心跳包,服务器不必返 ...
- kafka 设置消费者线程数
http://blog.csdn.net/derekjiang/article/details/9053863 分布式发布订阅消息系统 Kafka 架构设计 - 目前见到的最好的Kafka中文文章 M ...
- hdu 2881(LIS变形)
Jack's struggle Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- 微信小程序-二维码汇总
小程序二维码在生活中的应用场景很多,比如营销类一物一码,扫码开门,扫码付款等...小程序二维码分两种? 1.普通链接二维码 即跟普通的网站链接生成的二维码是一个意思,这种二维码的局限性如下: 对于普通 ...
- something about WinPE系统
[问]:啥是Win PE系统?做什么用的?和Win7哪个好? [答]:Win PE系统是一个小型系统,一般用特殊工具将Win PE制作在U盘里,电脑110的志愿者们使用它对电脑上原有系统进行修复或是进 ...
- android studio 入门比较好的书籍
http://blog.csdn.NET/aqi00/article/details/50012511 http://blog.csdn.net/aqi00/article/details/73065 ...
- JS中事件绑定问题
今天编写代码时遇到一个问题,我的判断语句(IFLESE)老是顺序执行结束后又跳到中间的语句里去执行了,找了半天没发现问题,最后才发现是事件绑定闹得鬼,不多说,先上代码为敬. JSP里 <butt ...
- Why Did the Cow Cross the Road III(树状数组)
Why Did the Cow Cross the Road III 时间限制: 1 Sec 内存限制: 128 MB提交: 65 解决: 28[提交][状态][讨论版] 题目描述 The lay ...