首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
07-31 11:52
快手_机器学习算法部_机器学习算法工程师(准入职员工)
快手内推
在快手做了三个多月的后端开发实习,在这里浅浅分享下我的实习体验~ 工作节奏: 基本上是早10晚9,周末双休。整体来说工作强度还是不小的,不过应该也是互联网常态了吧QAQ 福利待遇: 技术岗是400/天,晚上8点以后下班会发30餐补,入职也会一次性发180能量券,学校不在当地的话还可以申请1500/月的房补。¥这块老铁厂还是挺大方的哈哈。 实习生培养: 团队氛围很nice,我的mentor人真的很好,有问题向他请教都会很细致很耐心地给我解答,好感度upup~不过同事们平时可能都比较忙,捕捉到他们不容易,所以每次沟通或者汇报前最好提前做好准备。具体工作职责的话,一开始基本是接同事们剩下的活,直接上...
快手公司福利 971人发布
点赞
评论
收藏
分享
07-28 08:34
中国人民大学 Java
分享美团-商业分析面试题
无人机-商业分析实习生 美团集团1.你如何进行案头研究?请说说整理和收集行业信息的步骤和方法。2.给一个例子说明你如何支持无人机在多种场景落地应用的调研和分析。3.在你之前的实习或项目中,参与过数据分析相关工作吗?用过哪些统计或分析工具?4.你对AI工具的应用经验有哪些?有哪些工具你最感兴趣或实践过?5.你平时如何利用AI工具提升工作效率?6.针对无人机商业分析,你觉得哪些数据指标最重要?为什么?参考的是下面的岗位(已经过jobleap.cn授权可在牛客网发布)。
jobleapcn每日新...
点赞
评论
收藏
分享
07-02 10:39
门头沟学院 Java
JAVA开发想找个实习这么难吗
鼠鼠是26届双非学院本,boss上打招呼都不读,要么就是已读不回,用应届生求职还好点 ,今天约了一个面试,但我朋友昨天面了,只能说确实是小厂,一坨 现在真的很焦虑了
Steven267:
说点真实的,都要秋招了,还没有实习,早干嘛去了,本来学历就差
,现在知道急了,而且你这个简历完全可以写成一页,劣势太大了,建议转测试
点赞
评论
收藏
分享
07-08 20:24
江西应用科技学院 C++
鼠鼠27届的还有机会吗
如何写一份好简历
点赞
评论
收藏
分享
07-29 20:28
中南大学 C++
研发岗和开发岗是一个意思吗?
今天给大家分享的是一位粉丝的提问,研发岗和开发岗是一个意思吗?接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。同学提问:什么是研发岗?什么是开发岗?自研团队又是什么意思?Yt回答:讲一下这个研发岗和开发岗,这里跟有些公司它对于研发团队的定义是不一样的。因为有些公司是做产品的企业,所以它会叫做研发体系,你就比如华为内部它会叫研发岗,因为它们会有以产品为主这种出来,就包括像有些这种制造型企业,它也会有一个研发岗,它也会叫研发。其实研发的这个动作不单只是说代码研发,这里还包含硬件、包含模具、包含电源,都是属于研发体系的。那这里的开发就是development...
计算机就业职业规划辅导
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
百度提前批,三面被推迟一周,喜提秋招第一凉
7445
2
...
虾皮秋招一面
3077
3
...
他拿大厂SSP Offer打牌是什么概念啊?25届双非之光
2707
4
...
百度提前批 三面
2525
5
...
小鹏offer
1530
6
...
被猿辅导挂了简历,但我想说...
1418
7
...
虾皮一面凉经
1376
8
...
最强本科✌
1305
9
...
上班一周,工资还没拿,先欠公司两千
1254
10
...
大学四年,我感觉我像个“孤勇者”
1165
创作者周榜
更多
正在热议
更多
#
简历上的经历如何包装
#
29515次浏览
821人参与
#
秋招被确诊为……
#
164125次浏览
751人参与
#
中兴秋招
#
205692次浏览
2295人参与
#
工作中哪个瞬间让你想离职
#
63655次浏览
569人参与
#
你最希望上岸的公司是?
#
135199次浏览
705人参与
#
和同事相处最忌讳的是__
#
24403次浏览
244人参与
#
25届网易互娱暑实进度
#
78425次浏览
702人参与
#
虾皮求职进展汇总
#
249444次浏览
1856人参与
#
投格力的你,拿到offer了吗?
#
86770次浏览
583人参与
#
2022毕业即失业取暖地
#
102710次浏览
662人参与
#
2022毕业生求职现身说法
#
89289次浏览
700人参与
#
秋招OC许愿
#
327809次浏览
2450人参与
#
你最近一次加班是什么时候?
#
71001次浏览
350人参与
#
26届的你,投了哪些公司?
#
45199次浏览
497人参与
#
你的秋招第一面感觉怎么样
#
76918次浏览
591人参与
#
柠檬微趣工作体验
#
6737次浏览
40人参与
#
你遇到最难的面试题目是_
#
16647次浏览
201人参与
#
我对___祛魅了
#
48481次浏览
441人参与
#
地平线求职进展汇总
#
52651次浏览
370人参与
#
研究所VS国企,该如何选
#
194830次浏览
1819人参与
#
如果校招重来我最想改变的是
#
271904次浏览
2853人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务