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的更多相关文章

  1. iOS:KVO/KVC 的概述与使用

    iOS:KVO/KVC 的概述与使用       KVO   APP开发技术QQ群:347072638 一,概述 KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性 ...

  2. 【原】iOS中KVC和KVO的区别

    在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...

  3. iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b

    1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...

  4. iOS开发-KVC和KVO的理解

    KVC和KVO看起来很专业,其实用起来还是比较简单的,KVC(Key-value coding)可以理解为键值对编码,如果对象的基本类型,那么键值对编码实际上和get,set方法没有区别,如果是属性是 ...

  5. ios使用kvc机制简化对json的解析

    在 ios开发中,我们经常需要对服务器的传回来的json进行解析,特别是对哪些字段特别多的就会又烦躁的情绪.tmd都是一样的东西,要为每个property赋值,真是累人啊.举个简单的例子吧.服务器会过 ...

  6. iOS 用KVC设置结构体

    iOS 用KVC设置结构体 在Fundation中KVC提供的键值路径只能访问对象,不能访问结构体.这很不面向对象. 执行下面的语句将会报错: [self setValue:@() forKeyPat ...

  7. iOS设计模式 —— KVC

    刨根问底KVC KVC 全称 key valued coding 键值编码 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性 ...

  8. 【iOS】KVC 与 KVO

    一.KVC与KVO *"KVC":key value Coding(键值编码) *目的:间接的改动或获取对象的属性,减少程序(类与类)之间的耦合度. *"KVO" ...

  9. IOS之KVC和KVO(未完待续)

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  10. IOS之KVC机制(Object-C篇)

    开发环境:xcode7 一.KVC概述 1.KVC是KeyValueCoding的简称,它是一种可以直接通过类属性的名字来作key,再绑定key的值来访问类属性的机制,而不再通过利用@property ...

随机推荐

  1. Linux块设备驱动(二) _MTD驱动及其用户空间编程

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  2. C#生成漂亮验证码完整代码类

    using System;using System.Web;using System.Drawing;using System.Security.Cryptography; namespace Dot ...

  3. 当Node.js遇见Docker

    Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...

  4. 怎样获得PRINCE2证书?报名PRINCE2有什么条件?

    参加培训:想要获得PRINCE2资格证书,参加培训是非常必要的,正规的培训机构有获得组织认证考试的权力.光环国际全年开设prince2课程班,全国各个地区均可以选择培训及考试 选择培训机构:只有经AP ...

  5. React-Native 之 项目实战(三)

    前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...

  6. IOS开发创建开发证书及发布App应用(七)——在iTunes创建填写应用基本信息

    7.在iTunes创建填写应用基本信息 依旧打开苹果的开发者网站 https://developer.apple.com/ 点击Member,如下图 (注意,下面的图示是登录之后的) 点击iTunes ...

  7. 序列化与反序列化的单例模式实现和readResolve()

    如: public class SingleTest implements Serializable{private static final long serialVersionUID = -860 ...

  8. java 基础知识十 继承和多态

    java  基础知识十   继承和多态 继承 1.定义: 继承是指声明一些类,可以再进一步声明这些类的子类,而子类具有父类已经拥有的一些方法和属性,这跟现实中的父子关系是十分相似的,所以面向对象把这种 ...

  9. 开源的C#实现WebSocket协议客户端和服务器websocket-sharp组件解析

    很久没有写博客了(至少自己感觉很长时间没有写了),没办法啊,楼主也是需要生活的人啊,这段一直都在找工作什么的.(整天催我代码的人,还望多多谅解啊,我会坚持写我们的项目的,还是需要相信我的,毕竟这是一个 ...

  10. 关于constraint的用法

    1.主键约束:要对一个列加主键约束的话,这列就必须要满足的条件就是非空因为主键约束:就是对一个列进行了约束,约束为(非空.不重复)以下是代码  要对一个列加主键,列名为id,表名为emp格式为:alt ...