文档章节

iOS--KVC

gitzhengjianhua
 gitzhengjianhua
发布于 2016/07/22 17:27
字数 1309
阅读 31
收藏 1
点赞 0
评论 0

一直在使用一些方法比如在给模型赋值时使用的setValuesForKeysWithDictionary:jsonObject、改变一些属性时valueForKeyPath等。但面试的时候,面试官一句给我说一个应用场景。我靠,当时我想吃土。结果是当然回答的不好,当然我会使用KVC,我也知道它,但我不能驾驭KVC。

有个观点我很认同,我们做前端的只要会用知道怎么用怎么搭建出界面就行,这样我们的任务就完成。但是如果知道运行原理,我们能作出更好的App。就比如组装车的如果知道发动机和刹车运行机制,那么他就能组出性能更棒的车,也能避免好多问题。

a、介绍

我们可以用KVC直接使用字符串访问成员变量,而不使用setter或者getter方法。原因是KVC提供了一种在编译时动态访问对象属性和成员变量的方法。它很灵活但同时也失去了在编译期间的检查,如果有错我们也只能在运行时发现,比如通过使用valueForKeyPath访问一个属性或者其它时,只用当真正运行此处的时候我们才能发现是否有此属性。

b、注意点

  1. valueForKey:以字符串调用对象的get属性方法,或者读取成员变量的值;setValue:forKey:以字符串调用对象的set属性方法,或者修改成员变量的值。
  2. 对于基本数据类型,KVC方法会对基本数据类型进行封装(基本数据类型封装为NSNumber,其他结构体类型封装为NSValue)。比如int型,valueForKey:方法返回的是NSNumber对象,需要再调用intValue取出其中的值。setValue:forKey:方法与之类似,接收NSNumber参数。
  3. 在使用KVC时,如果找不到字符串对应的属性和成员变量时会怎么样?此时会调用valueForUndefinedKey:或者setValue:forUndefinedKey:这两个方法,默认情况下会抛出异常。一般我自己在模型对象中会重写这两个方法,因为当模型对象中的属性名称和后台返回的json里面某些数据名称不一样时,可以很方便的检测出,也能防止崩溃。
  4. 默认情况下KVC方法能够直接访问类的私有成员变量(就上面那个面试,我在苦思冥想之后说KVC可以访问到私有变量,但是面试官一句那要私有干嘛。呃  我当时想,完了  没法玩了  完全不在一个等级上),也可以重写accessInstanceVariablesDirectly方法,并令其返回NO(默认是返回YES)。KVC方法定义在NSKeyValueCoding类别中,该类别附加于NSObject类上,所以所有对象都具有这些方法。在此,反正我不提倡访问私有变量,就如哪位面试官说的。声明私有代表不想被访问到,我们如果这样干不是逆天而行吗?如果真的在外部使用到此变量,它还是私有的,大多数情况下只能说明我们自己的设计有问题,当然也有例外。
  5. 在一些特殊的类的对象上调用KVC方法会有特别的效果。对于数组NSArray、集合NSSet,调用valueForKey:会对每个数组和集合成员调用valueForKey:,并返回新的数组或者集合。如我们需要把一个数组里面的字符串取出来将首字母大写,并将新的字符串存到新数组中我们可以使用KVC很方便的达到需求

      [array valueForKeyPath:@“str.capitalizedString”];

valueForKeyPath称为键值链(Key Path)。键值链是用点将若干键相连的字符串,通过在对象上调用valueForKeyPath:或者setValue:forKeyPath:。

c、干货

KVC有些东西经常被忽略掉,但是很使用的小技巧。

我对于KVC嵌套知识点学习自一篇简书,感觉人家整理的很棒,先感谢人家,在此就厚颜无耻的引用下。

文/水瓶座_iOSer(简书作者)

原文链接:http://www.jianshu.com/p/a6a0abac1c4a

获取数组里的,最大、最小、平均、求和

NSArray *array = @[@"10",@"35",@72,@78,@"1"]; 

NSNumber *sum = [array valueForKeyPath:@"@sum.floatValue"]; 

NSNumber *avg = [array valueForKeyPath:@"@avg.floatValue"]; 

NSNumber *max = [array valueForKeyPath:@"@max.floatValue"]; 

NSNumber *min = [array valueForKeyPath:@"@min.floatValue"];  

删除重复数据

NSArray *array = @[@"name", @"w", @"aa", @"zxp", @"aa"]; //返回的是一个新的数组

 NSArray *newArray = [array valueForKeyPath:@"@distinctUnionOfObjects.self"]; 

NSLog(@"%@", newArray);

同样可以嵌套使用,先剔除name对应值的重复数据再取值

NSArray *array = @[ @{@"title":@"zxp",@"name":@"zhangxiaoping"}, @{@"title":@"zxp2",@"name":@"zhangxiaoping2"}, @{@"title":@"zxp",@"name":@"zhangxiaoping3"}, @{@"title":@"zxp",@"name":@"zhangxiaoping"}];

//根据name字段,来进行重复删除。

NSArray *newArray = [array valueForKeyPath:@"@distinctUnionOfObjects.name"];

//如果要根据title字段来删除重名的写法为`@distinctUnionOfObjects.title` 

NSLog(@"%@", newArray);

/*

print:( zhangxiaoping3, zhangxiaoping2, zhangxiaoping)是一个字符串数组*/

进行实例方法的调用

NSArray *array = @[@"name", @"w", @"aa", @"ZXPing"]; 

NSLog(@"%@", [array valueForKeyPath:@"uppercaseString"]);

相当于数组中的每个成员执行了uppercaseString方法,然后把返回的对象组成一个新数组返回。既然可以用uppercaseString方法,那么NSString的其他方法也可以,比如[array valueForKeyPath:@“length"]。当然,其他对象的实例方法也可以以此类推来进行调用。

© 著作权归作者所有

共有 人打赏支持
gitzhengjianhua

gitzhengjianhua

粉丝 4
博文 25
码字总数 23833
作品 3
渭南
iOS高仿QQ侧滑控件、下载框架、动画效果、扫一扫、颜色变化、K线图等源码

iOS精选源码 仿京东"加入购物车"转场动画(http://www.code4app.com/thread-28162-1-1.html) ColorTool(颜色转换)(http://www.code4app.com/thread-29256-1-1.html) Swift 专业版K线(http://w......

sunnyaigd ⋅ 04/17 ⋅ 0

iOS开发·runtime+KVC实现多层字典模型转换(多层数据:模型嵌套模型,模型嵌套数组,数组嵌套模型)

本文实验Demo传送门:DictToModelDemo 前言:将后台JSON数据中的字典转成本地的模型,我们一般选用部分优秀的第三方框架,如SBJSON、JSONKit、MJExtension、YYModel等。但是,一些简单的数据...

陈满iOS ⋅ 05/08 ⋅ 0

IOS12开发者预览版第二版使用评测

     手头有一部iPhone 6s Plus,因为之前看同学和朋友们升到IOS 11后手机变得非常卡顿所以没有升级。最近偶然看到IOS 12针对旧机型做了性能优化,号称提升70%相机打开速度、50%键盘显示...

张旭乾 ⋅ 前天 ⋅ 0

【AR】开始使用Vuforia开发iOS(2)

原 设置iOS开发环境 安装Vuforia iOS SDK 如何安装Vuforia iOS示例 编译并运行Vuforia iOS示例 支持iOS金属 iOS 64位迁移 设置iOS开发环境 适用于iOS的Vuforia引擎目前支持运行iOS 9及更高版...

lichong951 ⋅ 06/11 ⋅ 0

HDU ~ 6297 ~ CCPC直播 (模拟,输出格式控制)

思路:模拟就行了,注意Running和RTE的开头字母一样。 iomanip是I/O流控制头文件,就像printf的格式化输出一样。 以下是一些常用的: dec 置基数为10 相当于"%d" hex 置基数为16 相当于"%X" oc...

zscdst ⋅ 05/29 ⋅ 0

苹果对体无完肤的 iOS 11 最后的弥补

点击上方“CSDN”,选择“置顶公众号” 关键时刻,第一时间送达! 距离万众瞩目的苹果开发者大会(WWDC 2018)的召开还有不到一周时间,苹果公司于今天凌晨,正式发布了 iOS 11 的第十四次更...

csdnnews ⋅ 05/30 ⋅ 0

天生不凡ios怎么在电脑上玩 天生不凡ios电脑版玩法教程

天生不凡ios怎么在电脑上玩呢?现在有很多小伙伴都在玩天生不凡手游,不过相对于传统的在手机上进行游戏,很多人都倾向于新玩法,就是在电脑上玩天生不凡手游。下面小编就给亲们介绍下天生不...

kaopu8520 ⋅ 05/29 ⋅ 0

Dhar/YTTInjectedContentKit

YTTInjectedContentKit iOS壳版本场景下的批量修改类名、属性名、插入混淆代码、修改项目名称的shell脚本 具体的实现和使用方法请参考我的博客文章: iOS使用shell脚本注入混淆内容 iOS使用S...

Dhar ⋅ 05/04 ⋅ 0

苹果 WWDC 2018 重点推出 iOS 12

苹果正式宣布第 29 届年度全球开发者大会(WWDC 2018)将于美国当地时间 6 月 4 日星期一(北京时间 6 月 5 日凌晨一点)拉开帷幕,大会将持续到 6 月 8 日星期五。和 2017 年一样,此次会议...

问题终结者 ⋅ 04/15 ⋅ 0

又拍云Prism CDN 超低价 低延时 超强兼容的P2P-CDN

又拍云Prism CDN 超低价 低延时 超强兼容的P2P-CDN 2018-05-15 10:26编辑: 枣泥布丁分类:业界动态来源:https://www.upyun.com/products CDN又拍云 招聘信息: C++工程师 Cocos2d-x游戏客户...

枣泥布丁 ⋅ 05/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

oAuth2 升级Spring Cloud Finchley.RELEASE踩坑分享

背景 6.19号,spring团队发布了期待已久的 Spring Cloud Finchley.RELEASE 版本。 重要变化: 基于Spring Boot 2.0.X 不兼容 Spring Boot 1.5.X 期间踩过几个坑,分享出来给大伙,主要是关于...

冷冷gg ⋅ 40分钟前 ⋅ 0

OSChina 周一乱弹 —— 理发师小姐姐的魔法

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @冰冰棒- :分享田馥甄的单曲《My Love》 《My Love》- 田馥甄 手机党少年们想听歌,请使劲儿戳(这里) @Li-Wang :哎,头发又长了。。。又要...

小小编辑 ⋅ 今天 ⋅ 4

Kafka1.0.X_消费者API详解2

偏移量由消费者管理 kafka Consumer Api还提供了自己存储offset的功能,将offset和data做到原子性,可以让消费具有Exactly Once 的语义,比kafka默认的At-least Once更强大 消费者从指定分区...

特拉仔 ⋅ 今天 ⋅ 0

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部