IOS的KVC
KVC作用
KVC类似于java中的反射,它是通过一个字符串 key 来获取和设置对应类中成员属性的值
而key就是用来遍历某一个类,去查找类内部是否有与key同名的成员属性 所以对于KVC来说,成员属性无私有 共有之分,只要在类中,只要能找到相对应的就可以设置值 作用:
1. 给私有的成员属性赋值
2. 系统底层的给成员属性赋值都是采用KVC
演示代码
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool { // // 直接为对象的属性赋值
// Person *p1 = [[Person alloc] init];
// p1.name = @"张三";
//
// Dog *chihuahua = [[Dog alloc] init];
// chihuahua.name = @"吉娃娃";
// p1.dog = chihuahua;
//
// //NSLog(@"%@ --- %@", p1.name, p1.dog.name);
//
//
//
//
// // 通过kvc的方式为对象赋值
// Dog *husky = [[Dog alloc] init];
// husky.name = @"哈士奇";
//
//
// [p1 setValue:@"李四" forKeyPath:@"name"];
// [p1 setValue:@10 forKeyPath:@"age"];
// [p1 setValue:husky forKeyPath:@"dog"];
//
//
// NSLog(@"%@---%d", p1.name, p1.age);
// NSLog(@"%@", p1.dog.name); // //-----------------------------------
// Person *p1 = [[Person alloc] init];
//
// NSString *value = @"husky@yahoo.com";
//
// NSString *property = @"email";
//
//
// [p1 setValue:value forKeyPath:property];
//
// NSLog(@"%@", p1.name);
//
// NSLog(@"%@", p1.email); //------------------------------
// Person *p1 = [[Person alloc] init];
// Dog *d = [[Dog alloc] init];
//
// [p1 setValue:@"rzc" forKeyPath:@"name"];
// [p1 setValue:@"rzc@yahoo.com" forKeyPath:@"email"];
// [p1 setValue:@18 forKeyPath:@"age"];
// [p1 setValue:d forKeyPath:@"dog"];
//
// // @"dog.name" 这个就叫做keyPath 或者叫 "属性的路径"
// [p1 setValue:@"哈士猫" forKeyPath:@"dog.name"];
// NSLog(@"%@---%d---%@--%@",p1.name,p1.age, p1.email, p1.dog.name); // NSDictionary *bz = @{
// @"name" : @"任智超",
// @"age" : @28,
// @"email" : @"rzc0714@163.com",
// @"dog" : @{@"name" : @"加肥猫"}
// };
//
// [p1 setValuesForKeysWithDictionary:bz];
// NSDictionary *dogDict = (NSDictionary *)p1.dog;
// NSLog(@"%@---%d---%@--%@",p1.name,p1.age, p1.email, dogDict[@"name"]); //---------------------------------------------------
// Person *p1 = [[Person alloc] init];
// p1.name = @"张三";
//
// Dog *chihuahua = [[Dog alloc] init];
// chihuahua.name = @"吉娃娃";
// p1.dog = chihuahua;
//
// NSString *name = [p1 valueForKeyPath:@"name"];
// NSString *dogName = [p1 valueForKeyPath:@"dog.name"];
//
// NSLog(@"%@----%@", name, dogName); //------------把对象转成字典---------------------------------------
Person *p1 = [[Person alloc] init];
p1.name = @"张三";
p1.age = ;
p1.email = @"zs@yahoo.com"; Dog *chihuahua = [[Dog alloc] init];
chihuahua.name = @"吉娃娃";
p1.dog = chihuahua; // 把对象转成字典
NSDictionary *dict = [p1 dictionaryWithValuesForKeys:@[@"name", @"age", @"email", @"dog"]]; NSLog(@"%@", dict); NSLog(@"%@", [dict[@"dog"] class]);
NSLog(@"%@", [dict[@"dog"] name]); }
return ;
}
IOS的KVC的更多相关文章
- iOS:KVO/KVC 的概述与使用
iOS:KVO/KVC 的概述与使用 KVO APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性 ...
- 【原】iOS中KVC和KVO的区别
在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...
- iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b
1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...
- iOS开发-KVC和KVO的理解
KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...
- ios使用kvc机制简化对json的解析
在 ios开发中,我们经常需要对服务器的传回来的json进行解析,特别是对哪些字段特别多的就会又烦躁的情绪.tmd都是一样的东西,要为每个property赋值,真是累人啊.举个简单的例子吧.服务器会过 ...
- iOS 用KVC设置结构体
iOS 用KVC设置结构体 在Fundation中KVC提供的键值路径只能访问对象,不能访问结构体.这很不面向对象. 执行下面的语句将会报错: [self setValue:@() forKeyPat ...
- iOS设计模式 —— KVC
刨根问底KVC KVC 全称 key valued coding 键值编码 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性 ...
- 【iOS】KVC 与 KVO
一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的改动或获取对象的属性,减少程序(类与类)之间的耦合度. *"KVO" ...
- IOS之KVC和KVO(未完待续)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- IOS之KVC机制(Object-C篇)
开发环境:xcode7 一.KVC概述 1.KVC是KeyValueCoding的简称,它是一种可以直接通过类属性的名字来作key,再绑定key的值来访问类属性的机制,而不再通过利用@property ...
随机推荐
- MYSQL数据库-SELECT详解
将SQL文件导入数据库中 $ source /url/file_name.sql ======================================================= S ...
- VC++中经常出现的内存泄露和指针问题
要养成良好的编程习惯,每次用new开辟的新空间马上先写好释放语句delete.指针在程序中往往有很多细节问题,比如1.指针作为返回值,某个分支中进行赋值返回,另一个分支却没有值.2.指针作为函数参数传 ...
- es6中的let声明变量与es5中的var声明变量的区别,局部变量与全局变量
自己通过看typescript官方文档里的let声明,与阮一峰老师翻译的的es6学习文档,总结以下三点 1.var声明可以多次重复声明同一个变量,let不行 2.let变量只在块级作用域里面有效果,v ...
- 从今天开始学习Java了
//今天第一天学习了Java的起源兴起和用途,Java的特点和优势,又重新练习了hello world, public class Hello{ public static void main(Str ...
- JDBC连接Oracle数据库代码
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...
- linux系统使用python监测网络接口获取网络的输入输出
#!/usr/bin/env Pythonimport timeimport sys if len(sys.argv) > 1: INTERFACE = sys.argv[1]else: INT ...
- MongoDB基础教程系列--第三篇 MongoDB基本操作(二)
1.集合操作 1.1.创建集合 MongoDB 用 db.createCollection(name, options) 方法创建集合. 格式 db.createCollection(name, op ...
- 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结
老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
- ASP.NET自定义模块
要创建自定义模块,类需要实现IHttpModule接口.这个接口定义了Init和Dispose方法. Init方法在启动Web应用程序时调用,其参数的类型是HttpContext,可以添加应用程序处理 ...
- Kafka0.10.2.0分布式集群安装
一.依赖文件安装 1.1 JDK 参见博文:http://www.cnblogs.com/liugh/p/6623530.html 1.2 Scala 参见博文:http://www.cnblogs. ...