KVC基本使用

KVC和KVO底层原理 了解更多iOS底层原理知识,关注腾讯课堂八点钟学院iOS高级开发 iOS学习交流QQ群431449751KVC和KVO想必都熟知的一个名词,采用观察者模式,那么KVC到底是个什么,KVO又是什么,它们之间是怎样关联的,一起来解决这些疑惑。像我们银行卡bankCard的余额变动,会及时通知给用户,这种场景就运用了观察者模式,达到了系统的高效高性能处理;当你了解KVC机制,会恍然大悟,只要知道一个UI 阅读详情


首先,创建两个类,person类和book类。如图:


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

接着代码来将Main.h中

//
//  Created by 胡双飞 on 15/8/15.
//  Copyright (c) 2015年 HSF. All rights reserved.
//

/** (键/值编码)
 *  KVC的基本使用方法:以字符串的形式(关注属性的key)向对象发送消息,查找是否有存在setter
 *                  getter方法,如果不存在,查找_key或key的实例变量,可以设置值。
 *                  同时,通过kvc,也可以获取不存在getter方法的对象值,不需要对象指针
 *                  指向直接访问。(可以设置对象属性的值,也可以获取对象属性的值)
 *  下面的数字和代码中的数字标识的代码例子一致。
 *  1.通过 setValue: forkey: 来设置对象的值(单个设置).如果是int、float、BOOL等基本
 *                          数据类型时,要封装简单可以用 @ 来搞定。
 *  
 *  2.通过 valueForKey:  获取对象的值。
 *
 *  3.通过 valueForKeyPath: 可以通过 英文的点 . 访问到路径指向的值。
 *
 *  4.通过valueForKeyPath:可以访问存储到数组中的每个对象的值,接受时也要用NSArray来接受
 *  
 *  5.通过setValue: forKeyPath: 也可以将访问到路径上的实例对象设值
 *
 *  6.通过dictionaryWithValuesForKeys:(NSArray *)keys  可以通过多个key获取属性值,
 *    并以key-value形式存放到字典中。
 *
 *  7.setValuesForKeysWithDictionary:可以通过字典直接给多个属性设值,常用字典转模型中
 *
 */

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Book.h"
//kvc和数组的基本关系
void kvcWithArray();
int main(int argc, const char* argv[])
{
    @autoreleasepool
    {
        //建立一个书类
        Book* book = [[Book alloc] init];
        book.name = @"西游记";
        //建立人
        Person* person = [[Person alloc] init];
        person.name = @"pig";
        person.book = book;

        //person.age = 5;
        //1.当是int,float,BOOL基本数据类型时,要进行封装.
        [person setValue:@5 forKey:@"age"];
        NSLog(@"%zd", person.age);

        //2.通过valueForKey:取值将值从对象解析成NSInterager类型
        NSInteger age = [[person valueForKey:@"age"] integerValue];
        NSLog(@"%ld", age);

        //3.valueForKeyPath基本运算 (方式一)
        NSString* bn = [person valueForKeyPath:@"book.name"];
        NSLog(@"%@", bn);
        //方式二
        [person.book valueForKeyPath:@"name"];
        NSLog(@"%@", person.book.name);

        //4.和数组的关系
        kvcWithArray();

        //5.通过setValue: forKeyPath: 方法来设置值。
        Person* pn = [[Person alloc] init];
        [pn setValue:@"xishi" forKeyPath:@"name"];
        [pn setValue:@"25" forKeyPath:@"age"];
        [pn setValue:@"春秋战国" forKeyPath:@"book.name"];

        //取值
        NSString* nameKeyPath = [pn valueForKeyPath:@"name"];
        NSInteger ageKeyPath = [[pn valueForKeyPath:@"age"] integerValue];
        NSString* bookKeyPath = [person valueForKeyPath:@"book.name"];
        NSLog(@"名字 %@", nameKeyPath);
        NSLog(@"年龄 %zd", ageKeyPath);
        NSLog(@"书名字 %@", bookKeyPath);

        //6.dictionaryWithValuesForKeys: 的使用,可以将数据直接放到字典里。@[ @"name" ,还可以放其他值]
        NSDictionary* dict = [pn dictionaryWithValuesForKeys:@[ @"age", @"name" ]];
        NSLog(@"-------%@", dict);

        //7.setValuesForKeysWithDictionary:可以通过字典直接给多个属性设值。
        Person* vkd = [[Person alloc] init];
        [vkd setValuesForKeysWithDictionary:dict];
        NSLog(@"名字 %@", vkd.name);
        NSLog(@"年龄 %zd", vkd.age);
        NSLog(@"书名字 %@", vkd.book.name);
        /*
         2015-08-17 11:20:42.325 02-KVC[656:33512] 名字 xishi
         2015-08-17 11:20:42.325 02-KVC[656:33512] 年龄 25
         2015-08-17 11:20:42.326 02-KVC[656:33512] 书名字 (null)
         */
        //这里输出结果中书名字为空,原因是我在第六中的字典中没有赋值。
        //(1)用kvc时,可以少值,不能多值,如果多值会出现程序崩溃。
        //(2)在字典转模型时,
        //   在模型类的.m文件,放上-(void)setValue:(id)value forUndefinedKey:(NSString *)key{}
        //   方式来处理,当你的值多时就会来到这个方法,并且可以通过获取多值的属性.
    }
    return 0;
}

void kvcWithArray()
{
    Person* p = [[Person alloc] init];
    p.name = @"tangsen";
    p.age = 30;

    Person* p1 = [[Person alloc] init];
    p1.name = @"sunwukong";
    p1.age = 40;

    Person* p2 = [[Person alloc] init];
    p2.name = @"shaheshag";
    p2.age = 20;

    // 笨的方法将人名添加到数组中。
    //            NSMutableArray *names = [NSMutableArray array];
    //            for (Person *person in persons) {
    //                [names addObject:person.name];
    //            }

    //(1)创建的三个人加到数组中.
    NSArray* persons = @[ p, p1, p2 ];

    // 通过 valueForKeyPath, 取出persons数组中所有person对象的name属性值
    NSArray* names = [persons valueForKeyPath:@"name"];

    NSLog(@"%@", names);
}


iOS之深入解析KVC的底层原理和自定义KVC的实现 一、KVC 简介 ① 定义 KVC 是 Key-Value Coding 的简称,中文译义为键值编码。 KVC 是指 iOS 的开发中,可以允许开发者通过 Key 名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法。 KVC 是由 NSKeyValueCoding 非正式协议启用的一种机制,对象采用该协议来间接访问其属性,即可以通过一个字符串 key 来访问某个属性。这种间接访问机制补充了实例变量及其相关的访问器方法所提供的直接访问。 通过 KVC 就可以在运行时动态地访问和修改对象的 阅读详情

相关推荐

高通平台camera构架sensor驱动详解

优先阅读。

a5566255的专栏 3249

KVC的使用介绍

版权声明:本文为延成原创文章,转载请标明出处 KVC: Key Value Coding(键值编码) 利用KVC进行简单赋值 利用KVC进行综合赋值 利用KVC修改类的私有成员变量(UIPageControl) 字典转模型 取值 把模型转成字典 取出数组中所有模型的某个属性值 /** * 利用KVC进行简单赋值 */ void test(){ XMGPerson *person = [[XMGPerson alloc] init]; // 常规赋值 /* pers

延成的博客 384

Vue3多级路由缓存失效的深度解析与实战解决方案

本文深度解析了Vue3项目中多级路由嵌套下keep-alive缓存失效的根本原因,并提供了三种实战解决方案。通过剖析组件树、router-view与keep-alive的协作机制,揭示了缓存无法穿透多层router-view的技术本质。文章对比了路由扁平化重构、状态管理配合路由守卫以及使用社区插件等方案的优缺点与适用场景,为开发者解决这一常见难题提供了清晰的选型指导。

weixin_29001423的博客 270

oexmfnkukdepmhrrbqvtfzkooccqvv

http://www.huihui.cn/share/22029192 http://www.huihui.cn/share/22030058 http://www.huihui.cn/share/22031606 http://www.huihui.cn/share/22032888 http://www.huihui.cn/share/22033644 http://www.huihui.cn

u013793127的专栏 1752

【ShaderToy】开篇

写在前面呜呼,好久没有写博客了,好惭愧。题外话,感觉越大就越想家,希望可以一直和家人在一起,哪怕只是坐在一起不说话也觉得很温暖,一想到要分开眼睛就开始酸,哎。开学还是爬上来老实更新博客学习吧~今天爬上来一看,发现优快云的博客编辑终于更新了!进步总是好的,以前的编辑器实在很捉急。使用这种标记语言的确方便了很多,但好像颜色字体没法设置?程序员果然对美观没什么追求。ShaderToy如果你还没听过Sha

candycat 8万+

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

将图片转换为Base64编码字符串、解析Base64编码字符串后生成图片

代码 public class Test { public static void main(String[] args) { // 测试1:将图片转换成base64编码字符串 String code = imgToCode("C:\\Users\\mingming\\Pictures\\Screenshots\\1.png"); System.out.println("生成的base64编码字符串是:" + code); // 测试

qq_42449963的博客 13万+

Pytest教程:Pytest插件原理

Pytest的插件系统是其强大功能的核心,它允许用户和开发者扩展和定制测试框架的行为。要深入理解Pytest插件的原理,我们需要从Pytest的架构和设计模式开始,然后深入到底层源码。

旦莫的博客 636

kvc是什么

1)kvo是KeyValue Coding的简称,键值编码。它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过getter,setter方法访问。 2)获取值: valueForKey:传入nsstring属性的名字 valueForKeyPath:传入NSString属性的路径,xx.xx形式。 valueForUndefinedKey它的默认实现是抛出异常。可以重

u011508406的专栏 9709

【100%通过率】华为od机试C卷【特殊的加密算法】Python 实现

有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下1.明文为一段数字串由0-9组成2.密码本为数字0-9组成的二维数组3.需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是由相邻的单元格数字组成,上下和左右是相邻的,注意:对角线不相邻,同一个单元格的数字不能重复使用。

MISAYAONE的博客 5921

STM32芯片解锁读写保护:更改Option Byte [Error已解决]

解锁读保护:STLink更改Option Byte 变Level从1变为0,点击Apply即可。(程序执行读保护,其实是将Level从0变为1) 默认情况下该保护功能是不开启的,若要开启该功能,需要改写内部FLASH选项字节(Option Bytes)中的配置。 RDP读保护级别 级别0,无保护, 级别1,使能读保护, 这种保护下,若使用调试功能(使用下载器、仿真器)或者从内部SRAM自举时都不能对内部FLASH及备份SRAM作任何访问(读写、擦除都被禁止); 当芯片处于级别1的时候,可以把选项字节

HowieXue 薛永浩的博客 2万+

KVC的基本用法

KVC(KeyValueCoding)俗称“键值编码,是指可以通过一个key来访问某个属性在iOS中,提供了一种方法通过使用属性的名称(key)来间接访问属性对象的方法,这个方法可以不通过setter/getter方法来访问对象的属性KVC提供了一种间接访问其属性或成员变量的机制,可以通过字符串来访问其对应的属性方法或者成员变量KVC还可以访问私有变量。某些情况下,KVC还可以帮助简化代码。

weixin_61196797的博客 1146

基于Dify实现对Excel的数据分析

在dify部署完成后,大家就可以基于此进行各种应用场景建设,目前dify支持聊天助手(包括对话工作流)、工作流、agent等模式的场景建设,我们在日常工作中经常会遇到各种各样的数据清洗、格式转换处理、数据统计成图等数据分析工作,本次主要基于对话工作流模式对Excel文件、csv文件进行解析处理,并进行成图等数据分析工作。主要用到的插件有LLM节点,文档提取器、参数提取器、自定义代码节点、echart插件等。实现解析Excel数据,经过上述不同节点的处理分析流程,最终实现数据统计图展示。

hhue2007的专栏 1万+

KVC的使用

一、概念 1、KVC:Key-Value-Coding,对一个对象的属性,以键、值的方式,赋值 或 取值 的一套方法 2、KVC-是一些列分类方法,属于NSObject(凡是NSObject对象或者是子类,都具有KVC的方法) @interface NSObject(NSKeyValueCoding) 二、KVC 方法的使用    1. setValue:forKey  / s

徒步者 2188

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

KVO/KVC系列之一——什么是KVC

在iOS开发过程中,我们经常会听到或者用到KVO/KVC,但是对于什么是KVO和KVC,我们可能没有那么了解。下面先让我们来了解一下什么是KVC. 在苹果的官方文档中是这样描述KVC的:它是一种通过字符串描述符而不是通过调用访问方法或者直接使用实例变量的非直接的访问对象属性的机制,

somus的专栏 2650

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【iOS】KVC原理及自定义

本文深入探讨了iOS开发中的KVC(Key-Value Coding)机制。首先介绍了KVC的定义和基本API,包括setValue:forKey:/valueForKey:等核心方法。详细分析了KVC的底层实现原理:设值过程遵循set<Key>、set<Key>、<key>、_is<Key>的顺序查找;取值过程则按get<Key>、<key>、is<Key>等顺序查找。文章还提供了自定义KVC的实现方案......

2301_80095702的博客 837

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

KVC

1、概念: KVC(Key-value coding):键值对编码,也就是我们可以通过变量的名称来读取或者修改它的值,而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定。对于类里的私有属性,Objective-C是无法直接访问的,但是KVC是可以的。 作用: 取值和赋值(开发中基本不用) 获取对象私有变量的值.(经常使用,例如UIPageCon...

weixin_30650039的博客 409

【iOS】KVC总结

的全称是Key-Value Coding(键值编码),是由NSKeyValueCoding非正式协议启用的一种机制,对象采用这种机制来提供对其属性的间接访问,可以通过字符串来访问一个对象的成员变量或其关联的存取方法(getter or setter)。通常,我们可以直接通过存取方法或变量名来访问对象的属性。我们也可以使用KVC间接访问对象的属性,并且KVC还可以访问私有变量。某些情况下,KVC还可以帮助简化代码。KVC是许多其他 Cocoa 技术的基础概念,比如等等。

2402_86720949的博客 1097

KVC原理分析及应用

开始

Mr_yu__的博客 3595

KVO & KVC

KVC&&KVO在swift中用法

yueliangmua的博客 1122

iOS KVC使用

KVCKVC是个啥NSKeyValueCodingKVC怎么使用直接设值 & 取值操作字典keyPathKVC对于标量和结构体类型的处理KVC处理数据统计其他使用技巧用KVC来访问和修改私有变量Model和字典转换操作集合 KVC是个啥 **KVC(key-value Coding)**即键值编码,是iOS开发中,一种可以通过键名间接访问和赋值对象属性的机制.官方文档是这么介绍的: NSKeyValueCoding A mechanism by which you can access the p

王二东的博客 702

【iOS开发】—— KVC

KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。

qq_72437394的博客 1208

【iOS】——KVC

前面提到使用KVC操作属性时,如果这些属性没有setter、getter方法,也不存在对应的成员变量时,KVC将会自动会调用setValue: forUndefinedKey:或valueForUndefinedKey:方法。当调用KVC来设置对象的属性时,如果属性的类型为基本类型并且程序传入了对应类型的值,那么程序可以正常进行,如果属性的类型为字符串类型传入nil值也能正常进行,但是基本类型传入nil值则会自动执行setNilValueForKey:方法,因此为了满足我们的需求可以重写该方法。

m0_73974920的博客 435
上一篇: 自定义Log、打印执行哪个函数、判断当前是什么输入法
下一篇: IOS网络编程接口
hsf_study
博客等级 码龄11年 10粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值