白羽
2018-06-22
来源 :网络
阅读 2320
评论 0
摘要:本文将带你了解小白入门 五分钟看懂iOS开发中KVC与KVO的区别,希望本文对大家学IOS有所帮助。
一、KVC与KVO
*“KVC”:key value Coding(键值编码)
*目的:间接的修改或获取对象的属性,降低程序(类与类)之间的耦合度.
*“KVO”:key value Observer(键值观察),观察者模式.(检测模型变化用的多)
*目的:通常用于观察某个对象的某个属性发生变化时,及时做出相应.
二、KVC的使用方式
KVC被称为iOS开发平台的大招!!! 能快速修改对象属性。
*[p1 setValue:@“xxxx”forKeyPath:@“name”];修改指定对象属性.
*[arr valueForKeyPath:@“book.bookName”]; 获取对象属性.
*KVC通过键能直接取得数组.
*在使用KVC时, 一定要保证键值是存在的.
*原理: KVC取值时, 如果发现取值的对象不包含指定的键值,会自动进入对象内部成员进行查找.
三、KVO的使用方式
*KVO通常用于观察”对象某个属性”发生变化时,做出相应的反应.(多用于观察模型数据)
*KVO和通知中心的一个区别 : KVO只能盯着某个对象(在当前区域内部工作),通知中心可以穿越很多层(如viewController).
*KVO使用步骤:
*1.[stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:@"myObserver"];
*2.observeValueForKeyPath. 当指定键值发生改变时, 会自动调用这个方法
*3.removeObserver. 所有观察者模式的性能都不好,需要及时移除。
直接上代码:
[objc] view plain copy
1. //
2. // XNViewController.m
3. // KVC----KVO
4. //
5. // Created by neng on 14-6-21.
6. // Copyright (c) 2014年 neng. All rights reserved.
7. //
8.
9. #import "XNViewController.h"
10. #import "XNPerson.h"
11. #import "XNStudent.h"
12. #import "XNBook.h"
13.
14. @interface XNViewController ()
15.
16. @end
17. /**
18. * KVC: Key Value Coding(键值编码)
19. * 间接修改/获取对象的属性, 降低类与类之间的耦合度.
20. * KVO: Key Value Observer(键值观察)
21. KVO通常用于观察”对象的某个属性“发生变化时,及时做出响应!
22. 而NSNotificationCenter是需要POST"通知字符串"(表示监听的事件类型)的对象存在,通知中心才能够工作!
23. */
24.
25. @implementation XNViewController
26.
27. - (void)viewDidLoad {
28. [super viewDidLoad];
29. //1.简单的修改对象属性
30. [self kvcDemo1];
31. //2.对于子类, 也能直接修改
32. [self kvcDemo2];
33. //3.修改对象的book属性. (相当麻烦, 好要创建book对象).KVC一句话
34. [self kvcDemo3];
35. //4.获取对象的属性值. 可批量获取(如果是数组的话).
36. [self kvcDemo4];
37.
38. //KVO 演示
39. [self kvoDemo];
40. }
41.
42. - (void)kvoDemo {
43. XNStudent *stu = [[XNStudent alloc] init];
44. stu.name = @"xuneng";
45. //设置监听对象
46. //1》 负责观察的对象 self
47. //2》 观察的键值路径
48. //3》 观察的选项
49. //4》 上下文:通常用于区分不同的观察事件
50. [stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"myObserver"];
51.
52. stu.name = @"neng"; //修改
53.
54. //所有观察者模式的性能都不好, 需要及时移除
55. [stu removeObserver:self forKeyPath:@"name"];
56.
57. stu.name = @"xu"; //移除后再次修改
58. }
59.
60. /**
61. 当KVO指定的对象键值发生改变时, 会自动调用该方法
62. name: 观察的键值
63. object: 观察的对象
64. change: 修改的字典(新旧数值)
65. context: 指定观察者时传入的上下文
66. */
67. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(voidvoid *)context {
68. NSLog(@"|-- %@ --|-- %@ --|-- %@ --|-- %@--|", keyPath, object, change, context);
69. }
70.
71. /**
72. *简单的修改对象属性
73. */
74. - (void)kvcDemo1 {
75. //1.原始的方式. 点语法修改对象属性的值
76. XNPerson *p1 = [[XNPerson alloc] init];
77. p1.name = @"xuneng";
78. p1.age = 24;
79. // NSLog(@"%@ , %d",p1.name,p1.age);
80. NSLog(@"KVC1 demo1--> %@", p1); //这样直接调用description方法.
81.
82. //2.KVC来修改
83. [p1 setValue:@"xxxx" forKeyPath:@"name"];
84. [p1 setValue:@"10" forKeyPath:@"age"];
85. NSLog(@"KVC2 demo1--> %@ , %d", p1.name, p1.age);
86. }
87.
88. /**
89. *对于子类, 也能直接改
90. */
91. - (void)kvcDemo2 {
92. //1.传统方法
93. XNStudent *p1 = [[XNStudent alloc] init]; //学生
94. p1.name = @"student xuneng";
95. p1.age = 22;
96. // NSLog(@"%@ , %d",p1.name,p1.age);
97. NSLog(@"KVC1 demo2--> %@", p1); //这样直接调用description方法.
98.
99. //2.KVC来修改子类
100. [p1 setValue:@"xxxx" forKeyPath:@"name"];
101. [p1 setValue:@"10" forKeyPath:@"age"];
102. NSLog(@"KVC2 demo2--> %@ , %d", p1.name, p1.age);
103. }
104.
105. /**
106. *修改对象的book属性. (相当麻烦, 好要创建book对象).KVC一句话
107. */
108. - (void)kvcDemo3 {
109. //1.传统方法
110. XNStudent *p1 = [[XNStudent alloc] init]; //学生
111. p1.name = @"student xuneng";
112. p1.age = 22;
113. XNBook *myBook = [[XNBook alloc] init];
114. myBook.bookName = @"iOS";
115. p1.book = myBook;
116. NSLog(@"KVC1 demo3--> %@", p1);
117.
118. //2.KVC的方法
119. [p1 setValue:@"iPhone" forKeyPath:@"book.bookName"]; //学生里的book,book里的bookName
120. NSLog(@"KVC2 demo3--> %@", p1);
121. }
122.
123. /**
124. *获取对象的属性值. 可批量获取(如果是数组的话).
125. */
126. - (void)kvcDemo4 {
127. XNStudent *p1 = [[XNStudent alloc] init]; //学生1
128. p1.name = @"student1 xuneng";
129. p1.age = 24;
130. XNBook *myBook1 = [[XNBook alloc] init];
131. myBook1.bookName = @"iOS";
132. p1.book = myBook1;
133.
134. XNStudent *p2 = [[XNStudent alloc] init]; //学生2
135. p2.name = @"student2 xuneng";
136. p2.age = 23;
137. XNBook *myBook2 = [[XNBook alloc] init];
138. myBook2.bookName = @"iPhone";
139. p2.book = myBook2;
140.
141. NSArray *arr = @[p1, p2];
142.
143. //1.普通方法获取数组中对象的属性
144. NSMutableArray *arrBook = [[NSMutableArray alloc] init];
145. for (XNStudent *stu in arr) {
146. [arrBook addObject:stu.book.bookName];
147. }
148. NSLog(@"KVC1 demo4--> %@", arrBook);
149.
150. //2.KVC方法来获取数组中对象
151. NSLog(@"KVC2 demo4--> %@", [arr valueForKeyPath:@"book.bookName"]);
152. }
153.
154. @end本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号