首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
飞猴阿新
北京石油化工学院 iOS开发
发布于北京
关注
已关注
取消关注
@小生好怕怕:
KVC和KVO的理解(底层实现原理)
1、KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。 @interface myPerson : NSObject { NSString*_name; int _age; int _height; int _weight; } @end@interface testViewController :UIViewController @property (nonatomic, retain) myPerson*testPerson; @end - (void)testKVC { testPerson = [[myPerson alloc] init]; NSLog(@"testPerson‘s init height =%@", [testPerson valueForKey:@"height"]); [testPerson setValue:[NSNumber numberWithInt:168]forKey:@"height"]; NSLog(@"testPerson‘s height = %@", [testPerson valueForKey:@"height"]);} 第一段代码是定义了一个myPerson的类,这个类有一个_height的属性,但是没有提供任何getter/setter的访问方法。同时在testViewController这个类里面有一个myPerson的对象指针。 当myPerson实例化后,常规来说是无法访问这个对象的_height属性的,不过通过KVC我们做到了,代码就是testKVC这个函数。 运行之后打印值就是: 2016-6-8 11:16:21.970 test[408:c07] testPerson‘s init height = 02016-6-8 11:16:21.971 test[408:c07] testPerson‘s height = 168 这就说明确实读写了_height属性。 KVC的常用方法: - (id)valueForKey:(NSString *)key; -(void)setValue:(id)value forKey:(NSString *)key; valueForKey的方法根据key的值读取对象的属性,setValue:forKey:是根据key的值来写对象的属性。 注意: (1). key的值必须正确,如果拼写错误,会出现异常 (2). 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来 (3). 因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去 (4). NSArray/NSSet等都支持KVC 2、KVO的是KeyValue Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。iOS中有个Notification的机制,也可以获得通知,但这个机制需要有个Center,相比之下KVO更加简洁而直接。 KVO的使用也很简单,就是简单的3步。 1.注册需要观察的对象的属性addObserver:forKeyPath:options:context: 2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用 3.取消注册观察removeObserver:forKeyPath:context: KVO 内部实现原理 1. KVO 是基于runtime机制实现的. 2. 当某个类的对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法; 注意:派生类在被重写的setter方法中实现真正的通知机制 (Person -> NSKVONotifying_Person) @interface myPerson : NSObject { NSString *_name; int _age; int _height; int _weight; } @end @interface testViewController : UIViewController @property (nonatomic, retain) myPerson *testPerson; - (IBAction)onBtnTest:(id)sender; @end - (void)testKVO { testPerson = [[myPerson alloc] init]; [testPerson addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew context:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"height"]) { NSLog(@"Height is changed! new=%@", [change valueForKey:NSKeyValueChangeNewKey]); } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } - (IBAction)onBtnTest:(id)sender { int h = [[testPerson valueForKey:@"height"] intValue]; [testPerson setValue:[NSNumber numberWithInt:h+1] forKey:@"height"]; NSLog(@"person height=%@", [testPerson valueForKey:@"height"]); } - (void)dealloc { [testPerson removeObserver:self forKeyPath:@"height" context:nil]; [super dealloc]; } 第一段代码声明了myPerson类,里面有个_height的属性。在testViewController有一个testPerson的对象指针。 在testKVO这个方法里面,我们注册了testPerson这个对象height属性的观察,这样当testPerson的height属性变化时, 会得到通知。在这个方法中还通过NSKeyValueObservingOptionNew这个参数要求把新值在dictionary中传递过来。 重写了observeValueForKeyPath:ofObject:change:context:方法,这个方法里的change这个NSDictionary对象包含了相应的值。 需要强调的是KVO的回调要被调用,属性必须是通过KVC的方法来修改的,如果是调用类的其他方法来修改属性,这个观察者是不会得到通知的。
点赞 0
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
10-08 19:16
曼迪匹艾_人力资源部_HRBP(准入职员工)
MDPI内推,MDPI内推码
常见问题:3.加班吗 目前我是加班的,一般➕0.5-1h,加不加班主要看自己的进度和效率,刚入职,操作慢,一般会加班。 4.加班有加班费吗? NO,超过晚上七点🕖可以点一份工作餐(必须七点以后才可以点,需要5点之前点餐,如果你确定自己加班会超过七点,就可以点啦) 5.有KPI吗? 有的,入职3个月(发文15篇)和6个月(发文60篇)都要发文量要求。转正后每个季度30篇,超过30每篇奖励300💰。 6入职后有人带吗? 有的,入职后每个人都有师傅带,遇到的师傅就像读研选导一样,听天由命,幸运的遇到耐心负责的,运气差点的~,不过一般都还是很好的 7.公司环境如何? 和你在其他分享中看到的一样,女...
MDPI公司福利 390人发布
点赞
评论
收藏
分享
10-12 12:51
西北大学 Java
看看大家的选择,岗位都是测开,海思是算子相关的,百度是千帆质量保障相关
大家觉得这两个岗位哪个好一点,工资都差不多,发展怎么样,百度主管面说是面向大模型训推的测试工作,后来hrbp说工作是千帆质量保障,有大佬知道这方面工作是干什么的吗?
点赞
评论
收藏
分享
09-13 20:10
山东科技大学 供应链管理
求简历拷打
26双非研,无实习经历,求问如何破局
点赞
评论
收藏
分享
08-27 18:29
湖北师范大学 Java
java简历有啥子建议吗,
26届,0实习,感觉人生一眼望到头
点赞
评论
收藏
分享
昨天 22:57
已编辑
门头沟学院 C++
快手客户端一面(已挂)
继上次快手CPP二面挂了之后又投了客户端,没想到还给面,依旧拷打1h拷打项目20minTCP与UPD区别TCP三次握手为什么不能是两次HTTP与HTTPS区别SSL/TLS加密过程,为什么刚开始要先进行非对称加密,为什么不能一直用非对称加密,如何验证服务器身份如何理解C++的面向对象,封装、继承、多态多态实现方式虚函数如何实现,虚表存在哪里,如果没有虚函数有虚表指针吗,虚表指针有多大,虚表指针绑定时机STL常见容器vector、stack、queue底层,vector扩容原理,哈希底层如何用两个栈模拟一个队列如何实现优先级队列手撕:找数组中第一个和为target的连续子数组(前缀和)总体还行,...
查看11道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
HR面,到底该准备些啥(附核心问题回答思路)
1.8W
2
...
除了卷大厂,还有其他出路吗。。。
4559
3
...
懂车帝二面 2025.10.11 1h32min
4291
4
...
双非秋招timeline供参考(腾讯字节阿里快手美团)
3316
5
...
小红书一面面经
2947
6
...
牛牛求救🆘,不敢梭哈后端第二技能点怎么搭配
2891
7
...
10.12pdd笔试大鸭蛋
2575
8
...
第一次去北京那么远的地方实习,心里总是不安,大家会有这种感觉吗?
2388
9
...
10.12 拼多多技术岗笔试 第二题 求教
2388
10
...
华为10月10号考的手写LSTM被压中了
1971
创作者周榜
更多
正在热议
更多
#
面包vs爱情,怎么选?
#
7679次浏览
89人参与
#
职场新人体验
#
83851次浏览
595人参与
#
爱玛科技集团求职进展汇总
#
27130次浏览
195人参与
#
实习生如何通过转正
#
104195次浏览
1394人参与
#
tplink提前批进度交流
#
207040次浏览
1506人参与
#
安克创新求职进展汇总
#
53890次浏览
528人参与
#
深信服秋招来了
#
279687次浏览
2915人参与
#
Tplink求职进展汇总
#
180363次浏览
912人参与
#
秋招结束之后的日子
#
86216次浏览
976人参与
#
面试被问“你的缺点是什么?”怎么答
#
154670次浏览
2146人参与
#
贝壳求职进展汇总
#
34538次浏览
184人参与
#
硬件/芯片公司岗位评价
#
8321次浏览
28人参与
#
Offer比较,你最看重什么?
#
215213次浏览
1389人参与
#
互联网公司爆料
#
144663次浏览
708人参与
#
招银网络求职进展汇总
#
168340次浏览
992人参与
#
联影求职进展汇总
#
43040次浏览
284人参与
#
华为海思工作体验
#
29058次浏览
120人参与
#
新凯来求职进展汇总
#
49729次浏览
126人参与
#
材料进Fab厂真的劝退吗?
#
56098次浏览
204人参与
#
五一之后,实习真的很难找吗?
#
88024次浏览
556人参与
#
应届生,你找到工作了吗
#
69005次浏览
459人参与
#
总结:哪家公司最喜欢泡池子
#
144044次浏览
520人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务