首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
08-12 15:57
广西师范大学 大数据开发工程师
阳光电源挺火热的
听着网上对阳光电源的骂声一大片,但实际上面试都爆满呢。。。
点赞
评论
收藏
分享
08-15 16:55
门头沟学院 嵌入式软件开发
同事五点消失不是下班,是去给加班攒体力了
杭州的一家不知名小公司,当时入职的时候老板说工作时间早八晚五,我觉得工作时间不错就接了offer,在试用期的时候为了突出我为公司奋斗的精神,每天都是等所有同事走了之后大约5点半我才走。结果干了俩星期我就被辞退了。那时才知道原来同事们是去吃晚饭了,吃完饭接着回来加班,我真是服了。
规定下班时间vs实际下班...
点赞
评论
收藏
分享
08-02 09:25
北京大学 内容运营
秋招上岸啦
代码不跑我跑_bug...:
北大杀完9✌杀,9✌杀完鼠鼠杀
你最希望上岸的公司是?
点赞
评论
收藏
分享
06-19 22:53
江西应用科技学院 Java
求实习
大三找实习已老实,boss全是未读+已读不回,来个好心人把我捞走吧
积极的小学生不要香菜:
你才沟通多少,没500不要说难
点赞
评论
收藏
分享
08-13 09:38
北京科技大学 C++
总结常用的拖offer的几种话术
理由1:与父母沟通型话术1:您好,收到贵公司的offer非常荣幸,贵公司的发展前景和公司文化我都非常看好,与我的所学专业也很契合。目前我还没有和家里沟通,等我和家里沟通之后第一时间给您答复(这个时候一般可以拖2-5天,只要单位不催你,你就可以装死)。话术2:您好,这几天和家里沟通了贵单位的基本情况,家里各方面都挺满意的,但由于通勤较远(可替换其他原因)家里有点担心,想问问您公司有没有市内通勤车或者人才公寓呢(这里不管他回答什么,你都可以往下接)?我再和家里商量一下,三天内给您答复(这次如果催得紧最好说个时间,让公司感受到你的诚意)。理由2:系统故障型话术1:您好,我们学校的签约系统是网签。由于...
下北澤大天使:
好了我学会了,去哪里领offer练习
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
小红书java一面
4809
2
...
快手秋招-后端一面
4083
美团第二批笔试
热聊中
3
...
该不该给领导买东西啊...
3684
4
...
美团今天的ai coding笔试允许用ai吗
3197
5
...
秋招准备投这些厂可以吗?
3182
6
...
百度提前批一面凉经!继续复习!
2896
7
...
美团第二次笔试 算法题直接白卷投降
2884
8
...
大疆结构秋招一面
2871
9
...
小红书-引擎架构- java实习-一&二面凉经
2641
10
...
影石嵌入式面经
2469
创作者周榜
更多
正在热议
更多
#
你上一次给父母打电话是什么时候
#
13942次浏览
126人参与
#
扒一扒那些奇葩实习经历
#
71563次浏览
935人参与
#
秋招笔面试记录
#
200726次浏览
3453人参与
#
发工资后,你做的第一件事是什么
#
72707次浏览
252人参与
#
在职场上,你最讨厌什么样的同事
#
28261次浏览
206人参与
#
给26届的秋招建议
#
39952次浏览
1016人参与
#
实习的内耗时刻
#
60387次浏览
642人参与
#
我的秋招“寄”录
#
46213次浏览
604人参与
#
秋招投递记录
#
28540次浏览
315人参与
#
节后第一天上班,我的精神状态
#
13995次浏览
122人参与
#
校招第一份工作你干了多久?
#
99289次浏览
438人参与
#
安克创新求职进展汇总
#
40217次浏览
448人参与
#
我的AI电子员工
#
13469次浏览
107人参与
#
今年秋招哪家公司给的薪资最良心?
#
263063次浏览
1459人参与
#
选offer应该考虑哪些因素
#
86556次浏览
768人参与
#
如果校招重来我最想改变的是
#
279891次浏览
2908人参与
#
你最近一次加班是什么时候?
#
80282次浏览
432人参与
#
秋招,不懂就问
#
12526次浏览
135人参与
#
应届生初入职场,求建议
#
240795次浏览
2718人参与
#
工作上你捅过哪些篓子?
#
22188次浏览
140人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务