探索iOS中的KVC

目录

前言

1.iOS中的KVC(键值编码)

1. 什么是KVC?

2. 使用KVC

1.设置属性值

2.获取属性值

3. KVC的高级用法

1.访问私有属性

2.访问集合属性

4. KVC的安全性

5. KVC原理

1. 查找顺序

2. 设置值

6.参考文章


前言

        这篇文章主要是介绍KVC的用法。

1.iOS中的KVC(键值编码)

        在iOS开发中,KVC(Key-Value Coding,键值编码)是一种强大的机制,使得我们能够通过字符串键来访问对象的属性。KVC在许多iOS框架和技术中扮演着关键角色,包括Core Data、Cocoa Bindings以及KVO(Key-Value Observing,键值观察)。

1. 什么是KVC?

        KVC是一种间接访问对象属性的方法。通常,我们通过属性的getter和setter方法来访问或修改对象的属性。但使用KVC,我们可以通过字符串键来访问这些属性,这使得代码更加灵活和动态。

2. 使用KVC

        KVC主要通过setValue:forKey和valueForKey:方法来实现。

1.设置属性值

#import <Foundation/Foundation.h>@interface Person : NSObject@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;@end@implementation Person
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];// 使用KVC设置属性值[person setValue:@"John" forKey:@"name"];[person setValue:@30 forKey:@"age"];NSLog(@"Name: %@", person.name);NSLog(@"Age: %ld", (long)person.age);}return 0;
}

2.获取属性值

int main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];[person setValue:@"John" forKey:@"name"];[person setValue:@30 forKey:@"age"];// 使用KVC获取属性值NSString *name = [person valueForKey:@"name"];NSNumber *age = [person valueForKey:@"age"];NSLog(@"Name: %@", name);NSLog(@"Age: %@", age);}return 0;
}

3. KVC的高级用法

1.访问私有属性

        KVC不仅可以访问公共属性,还可以访问私有属性。尽管这是KVC的一个强大功能,但在实际开发中要谨慎使用。

@interface Person ()@property (nonatomic, strong) NSString *secret;@end@implementation Person
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];// 使用KVC访问私有属性[person setValue:@"This is a secret" forKey:@"secret"];NSString *secret = [person valueForKey:@"secret"];NSLog(@"Secret: %@", secret);}return 0;
}

2.访问集合属性

        KVC还提供了一些便捷方法来访问集合类型的属性,如数组和字典。

@interface Group : NSObject@property (nonatomic, strong) NSArray<Person *> *members;@end@implementation Group
@endint main(int argc, const char * argv[]) {@autoreleasepool {Person *person1 = [[Person alloc] init];[person1 setValue:@"Alice" forKey:@"name"];[person1 setValue:@25 forKey:@"age"];Person *person2 = [[Person alloc] init];[person2 setValue:@"Bob" forKey:@"name"];[person2 setValue:@28 forKey:@"age"];Group *group = [[Group alloc] init];group.members = @[person1, person2];// 使用KVC访问集合属性NSArray *names = [group valueForKeyPath:@"members.name"];NSLog(@"Names: %@", names);}return 0;
}

4. KVC的安全性

        使用KVC时需要注意一些安全性问题,例如:
        - 如果指定的键不存在,KVC会抛出一个异常。
        - 访问或修改私有属性可能违反封装性原则。

        因此,使用KVC时要确保键的正确性,并且要对可能出现的异常进行适当的处理。

5. KVC原理

        KVC 的实现主要依赖于以下几个方面:

1. 查找顺序

             当通过 `valueForKey:` 获取值时,KVC 按以下顺序查找属性:

  1. Getter 方法:首先查找与键对应的 getter 方法。例如,对于键 `name`,查找 `getName`、`name` 或 `isName` 方法。
  2.  实例变量:如果没有找到合适的 getter 方法,则查找以键命名的实例变量 `_name` 或 `name`
  3.   -accessInstanceVariablesDirectly:如果前两个查找都失败,KVC 会调用 `accessInstanceVariablesDirectly` 方法,该方法返回 YES 表示可以直接访问实例变量。

2. 设置值

        当通过setValue:forKey:设置值时,KVC 按以下顺序查找属性:

  1. Setter 方法:首先查找与键对应的 setter 方法。例如,对于键 name,查找 setName: 方法。
  2. 实例变:如果没有找到合适的 setter 方法,则查找以键命名的实例变量_name或 name
  3. setValue:forUndefinedKey:如果前两个查找都失败,KVC 会调用 `setValue:forUndefinedKey:` 方法,该方法通常会抛出一个异常。

#### KVC 的查找规则示例

@interface Person : NSObject {NSString *_name;
}
@property (nonatomic, strong) NSString *name;
@end@implementation Person
@end

当调用 `[person valueForKey:@"name"]` 时,KVC 的查找顺序如下:

1. 查找 `- (NSString *)name` 方法。
2. 查找 `- (NSString *)getName` 方法。
3. 查找 `- (NSString *)isName` 方法。
4. 查找实例变量 `_name` 和 `name`。
5. 调用 `accessInstanceVariablesDirectly` 方法,返回 YES,直接访问 `_name`。

当调用 [person setValue:@"John" forKey:@"name"] 时,KVC 的查找顺序如下:

1. 查找 - (void)setName:(NSString *)name 方法。
2. 查找实例变量 `_name` 和 `name`。
3. 调用 `setValue:forUndefinedKey:` 方法。

6.参考文章

1.Key-Value Coding Programming Guide: About Key-Value Coding

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UbuntuLinux系统下安装wrk和使用

前言 wrk是一个用c语言写的压力测试工具&#xff0c;非常有用&#xff0c;但是ubuntu的软件仓库没有收录wrk&#xff0c;需要我们自己进行编译和安装&#xff0c;最近在学习一些性能测试、性能优化方面的知识&#xff0c;需要使用到这个强有力的工具&#xff0c;故此记录安装和…

Windows安全应急--在应急响应中需要知道的信息

在网络安全事件发生后&#xff0c;一般是要去客户现场排查问题的&#xff0c; 那么要想解决问题&#xff0c;信息的完整性决定了这次任务的成败。。 1. 你需要知道的&#xff1a; 先让客户梳理一遍事情的起因经过结果 询问客户需要解决的问题 了解客户的网络环境&#xff08…

【ARM 嵌入式 C 入门及渐进 6.2 -- ARMv8 C 内嵌汇编读系统寄存器的函数实现】

请阅读【嵌入式开发学习必备专栏】 文章目录 ARMv8 C 内嵌汇编读系统寄存器 ARMv8 C 内嵌汇编读系统寄存器 要在ARMv8架构中通过C代码和内嵌汇编来读取系统寄存器s3_0_c15_c5_5的值&#xff0c;并将其返回&#xff0c;可以按照以下方式实现system_read_reg函数&#xff1a; #…

buuctf的RSA(二)

1.RSA 知道 flag.enc 和 pub.key&#xff0c;典型的加密、解密 将pub,key 改为pub.txt 打开后发现公钥 在RSA公私钥分解 Exponent、Modulus&#xff0c;Rsa公私钥指数、系数(模数)分解--查错网 进行解密 得到e65537 n8693448229604811919066606200349480058890565…

innerText和innerHTML的区别

innerHTML和innerText都是元素的属性&#xff0c;通过修改这个元素的属性可以达到修改元素内容的目的。但是二者之间略有不同。具体来说&#xff0c;它们的区别如下&#xff1a; innerHTML可以获取或设置元素内部的HTML内容&#xff0c;包括HTML标签&#xff0c;而innerText则…

LeetCode 79.单词搜索

原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内…

若依前后端分离版本-前后端交互整理

ruoyi-ui与后端交互 方法一&#xff1a;表单 使用 headers: {Content-Type:application/x-www-form-urlencoded}, ruoyi-ui的vue中 //ruoyi-ui的vue中定义 formData: {a: 111,b: 111,c: 1,}, //vue中方法调用 outBound() { empty(this.formData).…

6款网页表白代码6(附带源码)

6款网页表白代码6 前言效果图及部分源码1.爱心倒计时2.一起看星星3.爱心4.爱心&#xff08;有鼠标移动特效&#xff09;5.爱心&#xff08;高级效果&#xff09;6.爱心&#xff08;3D效果&#xff09; 领取源码下期更新预报 前言 大部分人都有喜欢的人&#xff0c;学会这些表白…

蓝桥杯物联网竞赛_STM32L071KBU6_关于sizo of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

微软Edge

微软Edge浏览器概述 功能介绍 微软Edge是一款基于Chromium开源项目的网页浏览器&#xff0c;旨在提供更快的网页加载速度、更高的安全性和更好的用户体验。它支持多种操作系统&#xff0c;包括Windows、macOS、Android和iOS&#xff0c;能够满足不同用户的需求。Edge浏览器拥…

赶紧收藏!2024 年最常见 20道 Redis面试题(三)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Redis面试题&#xff08;二&#xff09;-CSDN博客 五、Redis的持久化机制是什么&#xff1f; Redis 是一个高性能的键值存储系统&#xff0c;支持多种类型的数据结构&#xff0c;如字符串、哈希、列表、集合、…

python数据类型之字符串

目录 1.字符串概念和注意事项 2.字符串内置函数 3.字符串的索引、切片和遍历 4.字符串运算符 5.字符串常用方法 性质判断 开头结尾判断 是否存在某个子串 大小写等格式转化 子串替换 删除两端空白字符 格式化字符串 分割与合并 6.字符串模板 7.exec 函数 8.字符…

【Linux】-Zookeeper安装部署[17]

简介 apache ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 除了为Hadoop和H…

2024最新 Jenkins + Docker 实战教程(四) - 编写自己的Springboot项目实现自动化部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

VMware Num Lock 总自动切换的问题解决

VMware Num Lock 总自动切换的问题解决 0. 问题描述1. 解决方法 0. 问题描述 使用 VMware 虚拟机时&#xff0c;鼠标在 VMware 和主机之间切换时&#xff0c;总是显示 “Num Lock 开” 和 “Num Lock 关” 的提示框。 1. 解决方法 在 VMware 系统中&#xff0c;按 fn num 统…

0407放大电路的频率响应

放大电路的频率响应 单时间常数RC电路的频率响应中频响应高频响应低频响应全频域响应 放大电路频率响应概述1. 直接耦合放大电路频域响应阻容耦合放大电路频域响应 4.7.1 单时间常数RC电路的频率响应 4.7.2 放大电路频率响应概述 4.7.3 单级共射极放大电路的频率响应 4.7.4 单级…

TOSHIBA UTLH21 属于Unifi NV系列

TOSHIBA UTLH21 是东芝推出的一款工业控制器&#xff0c;属于Unifi NV系列。 这款控制器代表了东芝在工业自动化领域的一次重要进步&#xff0c;它在功能和性能上都超越了现有的V系列控制器。以下是UTLH21的一些主要特点&#xff1a; 高速逻辑与控制能力&#xff1a;UTLH21具…

Spring框架中获取方法参数名称:DefaultParameterNameDiscoverer

DefaultParameterNameDiscoverer 是Spring框架中用于获取方法参数名称的一个类。在Java中&#xff0c;方法的参数名称通常在编译时会丢失&#xff0c;因为Java字节码并不强制要求保留这些信息。Spring提供了一种机制来恢复这些参数名称&#xff0c;这就是通过DefaultParameterN…

IT行业的现状与未来趋势

这里写目录标题 一、引言二、IT行业的现状三、IT行业面临的挑战四、IT行业的未来趋势五、结论 一、引言 信息技术&#xff08;IT&#xff09;行业在过去几十年中经历了飞速发展&#xff0c;从早期的计算机硬件和软件开发&#xff0c;到如今涵盖云计算、人工智能、大数据、物联…

深度学习之基于Django+Tensorflow卷积神经网络实时口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着全球疫情的持续&#xff0c;佩戴口罩成为了公众日常生活中不可或缺的一部分。特别是在人员密集的…