问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

kvc是怎么挣钱

发布网友 发布时间:2023-02-01 16:45

我来回答

3个回答

热心网友 时间:2024-10-26 03:23

可以传入一个包含key、value的字典进去,KVC可以将所有数据按照属性名和字典的key进行匹配,并将value给User对象的属性赋值。

热心网友 时间:2024-10-26 03:24

接触iOS也有三四年了,感受颇多,经历过*也经过低潮,大浪淘沙 靠的都是硬功夫,经历过迷茫期,怀疑过自己,但是还是得坚持,生活就是这样,什么干好都是不容易的,最近有空来对这几年经历做些总结,每个人的经历都不一样,仁者见仁智者见智哈。
在一家公司待久了 慢慢都会变成业务性程序员,毕竟小企业还是以公司发展为目的,所以慢慢的对一些技术要求不是那么重要了,以能实现功能目的。所以我们大部分都是搬砖程序员,现在对iOS学习路线有些见解
1.原理,底层。知其然知其所以然,研究底层的过程中会恍然大悟,这是进阶必须要经历的阶段
2. 编程思想,设计模式,架构设计。项目中实战
3. 专业领域 --市场(ARKit\CoreML Open GL 等框架)---> 跨平台
扯得有点远了,言归正传。先上一张图看下API
270478-8035b5dfae171ec4.png.jpeg
KVC 全称 Key Value Coding
KVC主要对三种类型进行操作,基础数据类型及常量,对象类型,集合类型。

@interface BankAccount : NSObject
@property (nonatomic, strong) NSNumber *currentBalance;
@property (nonatomic, strong) Person *owner;
@property (nonatomic, strong) NSArray<transaction *> *transactions;
@end
在使用KVC时,直接将属性名当做key,并设置value,即可对属性进行赋值。
[myAccount setValue:@(100.0) forKey:@"currentBalance"];
除了对当前对象的属性进行赋值外,还可以对其更“深层”的对象进行赋值。例如对当前对象的address属性的street属性进行赋值。KVC进行多级访问时,直接类似于属性调用一样用点语法进行访问即可
[myAccount setValue:@"中关村大街" forKeyPath:@"address.street"];

通过keyPath对数组进行取值时,并且数组中存储的对象类型都相同,可以通过valueForKeyPath:方法指定取出数组中所有对象的某个字段。例如下面例子中,通过valueForKeyPath:将数组中所有对象的name属性值取出,并放入一个数组中返回。
NSArray *names = [array valueForKeyPath:@"name"];
通过keyPath对数组进行取值时,并且数组中存储的对象类型都相同,可以通过valueForKeyPath:方法指定取出数组中所有对象的某个字段。例如下面例子中,通过valueForKeyPath:将数组中所有对象的name属性值取出,并放入一个数组中返回
NSArray *names = [array valueForKeyPath:@"name"];
多值操作
KVC还有更强大的功能,可以根据给定的一组key,获取到一组value,并且以字典的形式返回,获取到字典后可以通过key从字典中获取到value。
- (NSDictionary<nsstring *, id> *)dictionaryWithValuesForKeys:(NSArray<nsstring *> *)keys;

NSArray *keys = @[@"name",@"age"];
NSDictionary *dict = [person dictionaryWithValuesForKeys:keys];
{
age = 222;
name = afei;
}

同样,也可以通过KVC进行批量赋值。在对象调用setValuesForKeysWithDictionary:方法时,可以传入一个包含key、value的字典进去,KVC可以将所有数据按照属性名和字典的key进行匹配,并将value给User对象的属性赋值。
赋值时会遇到一些问题,例如服务器会返回一个id字段,但是对于客户端来说id是系统保留字段,可以重写setValue:forUndefinedKey:方法并在内部处理id参数的赋值。
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
if ([key isEqualToString:@"id"]) {
self.userId = [value integerValue];
}
}
关于KVC valueForKey:key 的调用顺序
先调用相关方法,先后顺序:
getter 方法:getKey(注意Key首字母大写) --> key -->isKey
如果没有相关方法:看 +(BOOl)accessInstanceVariablesDirectly 返回值
默认 YES 找成员变量,先后顺序:_key ->_isKey ->key -> isKey
NO 异常 valueForUnderFineKey 可以重写补救
异常信息
当根据KVC搜索规则,没有搜索到对应的key或者keyPath,则会调用对应的异常方法。异常方法的默认实现,在异常发生时会抛出一个NSUndefinedKeyException的异常,并且应用程序Crash。
我们可以重写下面两个方法,根据业务需求合理的处理KVC导致的异常。
- (nullable id)valueForUndefinedKey:(NSString *)key;
- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;

异常处理
当通过KVC给某个非对象的属性赋值为nil时,此时KVC会调用属性所属对象的setNilValueForKey:方法,并抛出NSInvalidArgumentException的异常,并使应用程序Crash。
我们可以通过重写下面方法,在发生这种异常时进行处理。例如给name赋值为nil的时候,就可以重写setNilValueForKey:方法并表示name是空的。
- (void)setNilValueForKey:(NSString *)key {
if ([key isEqualToString:@"name"]) {
[self setValue:@"" forKey:@”name”];
} else {
[super setNilValueForKey:key];
}
}
集合属性操作
根据KVO的实现原理,是在运行时生成新的子类并重写其setter方法,在其内容发生改变时发送消息。但这只是对属性直接进行赋值会触发,如果属性是容器对象,对容器对象进行add或remove操作,则不会调用KVO的方法。可以通过KVC对应的API来配合使用,使容器对象内部发生改变时也能触发KVO。
在进行容器对象操作时,先调用下面方法通过key或者keyPath获取集合对象,然后再对容器对象进行add或remove等操作时,就会触发KVO的消息通知了。
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key API_AVAILABLE(macos(10.7), ios(5.0), watchos(2.0), tvos(9.0));
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
集合运算符
@count @max @min @sum @avg
私有访问
根据上面的实现原理我们知道,KVC本质上是操作方法列表以及在内存中查找实例变量。我们可以利用这个特性访问类的私有变量,例如下面在.m中定义的私有成员变量和属性,都可以通过KVC的方式访问。
这个操作对readonly的属性,@protected的成员变量,都可以正常访问。如果不想让外界访问类的成员变量,则可以将accessInstanceVariablesDirectly属性赋值为NO。
KVC在实践中也有很多用处,例如UITabbar或UIPageControl这样的控件,系统已经为我们封装好了,但是对于一些样式的改变并没有提供足够的API,这种情况就需要我们用KVC进行操作了。
可以自定义一个UITabbar对象,然后在内部创建自己想要的视图,并通过layoutSubviews方法在内部进行重新布局。然后通过KVC的方式,将UITabbarController的tabbar属性替换为自定义的类即可。
安全性检查
KVC存在一个问题在于,因为传入的key或keyPath是一个字符串,这样很容易写错或者属性自身修改后字符串忘记修改,这样会导致Crash。
可以利用iOS的反射机制来规避这个问题,通过@selector()获取到方法的SEL,然后通过NSStringFromSelector()将SEL反射为字符串。这样在@selector()中传入方法名的过程中,编译器会有合法性检查,如果方法不存在或未实现会报*警告。
[self valueForKey:NSStringFromSelector(@selector(object))];

1
© 著作权归作者所有
杜康厂家直招天水代理,低至12元,完成任务送汽车!一城一代理

杜康
广告
推荐阅读
object.defineProperty()实现双向数据绑定
说辞
阅读430
怎么理解Kotlin中的数组?看完这篇必懂!
安安_660c
阅读129
谈谈this和super关键字
Kyriez7
阅读572
OC与Java的简单对比
可地出溜
阅读247
AbstractBeanFactory#getBean()核心流程源码解析
王侦
阅读101

热心网友 时间:2024-10-26 03:24

这个(Key-Value Coding)是一种Objective-C的编程技术,它可以让开发者在不使用getter和setter方法的情况下访问和修改对象的属性。KVC不能直接挣钱,但它可以帮助开发者更快地实现功能,从而节省时间和成本。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我的眉毛中部有几根会往上翘有什么说法吗? 儿童补铁的药哪种效果最好? 儿童补铁口服液哪个牌子好 台湾的共享单车有人用过吗,想知道他们用的哪款车坐垫用的是哪家的,和... city bike和roadbike区别 报春花怎样扦播 电脑连接上无线网络不能上qq为什么电脑连上无线网却只能登qq 能上网但是不能上qq,是什么原因? 金山网盾、金山网镖、金山毒霸、金山清理专家四个软件哪个防护好一点... 上网的时候,金山网镖、金山网盾和金山毒霸这三个程序需要都开着吗? 传奇逐鹿中原法师买什么武器 大庆新开仿逐鹿传奇08年1月1日晚21:00准时献宝。 intel那种芯片好,赛扬、奔腾、酷睿以高到低排序 ...Intel的处理器赛扬、奔腾、酷睿、Atom哪个好些?请给我说详细点,拜托... 梦见好朋友受伤什么意思? 梦见别人受伤严重什么意思? 就业局花了1380考保育师的证有用吗 沧州广义取名行怎么样 我有一个无线路由器是开放式的,我想把它设置成不开放 商家一直不发货可以得到什么赔偿 急求高中英语单词听力的MP3~!! 把胶皮鞋垫晒的缩在一起,怎么让鞋垫恢复 知道一个人qq怎么查抖音 小额贷款公司发展成村镇银行有什么好处 淘宝网卖家的信誉等级是如何划分的 淘宝店铺等级是如何划分的? 淘宝店铺等级是怎样划分的? 华怎么写 抖音如何能直接发视频不用打开抖音 抖音给客户发群发产品视频违规吗 大学生农村医保可以交半年吗多少钱 赤峰市红山区医疗保险每年要交多少钱? 荆州社保缴费标准2022 2008年荆州养老保险缴费基数 湖北荆州市2021-2022年社保缴费档次六个档次 湖北省荆州市养老金7月份退休的怎么没重算?什么时候补发 零基础的想学网络工程师要从哪里学起?麻烦告诉我 电脑的地址栏隐藏了怎么显示 子夜是指的什么时间 丰盈液,丰盈霜哪个好 蚂蚁奇特特征描写作文 一个王朝的背影 魔声蓝牙耳机头戴式该怎么去和苹果5s连接 支付宝交电费为什么余额宝不能用了啊 手机内存总是不够用? NetData搭建 -- Linux性能实时监测工具 fda网站账号密码登录不上 一路乐网站的账户怎么删除 我被车撞了对方全责,我该怎么要求理赔 猕猴桃树何时种植 猕猴桃树什么时候种植