当前位置: 首页 > news >正文

大学生做网站步骤电商大数据查询平台免费

大学生做网站步骤,电商大数据查询平台免费,网站开发工程师面试试题,广东省建设业协会网站在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间接访问实例变量的方法。 KVC 提供了一个使用字符串(Key)而不是访问器…

在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下

KVC(Key Value Coding)

 1> 概述

  KVC:Key Value Coding,键值编码,是一种间接访问实例变量的方法。

  KVC 提供了一个使用字符串(Key)而不是访问器方法,去访问一个对象实例变量的机制。

 2> KVC部分源码(头文件)

复制代码
 1 // NSKeyValueCoding.h2 @interface NSObject(NSKeyValueCoding)3 4 + (BOOL)accessInstanceVariablesDirectly;5 6 - (nullable id)valueForKey:(NSString *)key;7 - (void)setValue:(nullable id)value forKey:(NSString *)key;8 - (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;9 
10 - (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
11 
12 - (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);
13 
14 - (NSMutableSet *)mutableSetValueForKey:(NSString *)key;
15 
16 - (nullable id)valueForKeyPath:(NSString *)keyPath;
17 - (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;
18 - (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError **)outError;
19 - (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
20 - (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath NS_AVAILABLE(10_7, 5_0);
21 - (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
22 
23 - (nullable id)valueForUndefinedKey:(NSString *)key;
24 - (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key;
25 - (void)setNilValueForKey:(NSString *)key;
26 - (NSDictionary<NSString *, id> *)dictionaryWithValuesForKeys:(NSArray<NSString *> *)keys;
27 - (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
28 
29 @end
30 
31 @interface NSArray<ObjectType>(NSKeyValueCoding)
32 
33 - (id)valueForKey:(NSString *)key;
34 - (void)setValue:(nullable id)value forKey:(NSString *)key;
35 
36 @end
37 
38 @interface NSDictionary<KeyType, ObjectType>(NSKeyValueCoding)
39 
40 - (nullable ObjectType)valueForKey:(NSString *)key;
41 
42 @end
43 
44 @interface NSMutableDictionary<KeyType, ObjectType>(NSKeyValueCoding)
45 
46 - (void)setValue:(nullable ObjectType)value forKey:(NSString *)key;
47 
48 @end
49 
50 @interface NSOrderedSet<ObjectType>(NSKeyValueCoding)
51 
52 - (id)valueForKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);
53 - (void)setValue:(nullable id)value forKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);
54 
55 @end
56 
57 @interface NSSet<ObjectType>(NSKeyValueCoding)
58 
59 - (id)valueForKey:(NSString *)key;
60 - (void)setValue:(nullable id)value forKey:(NSString *)key;
61 
62 @end
复制代码

  可以看到这个类里面包含了对类NSObject、NSArray、NSDictionary、NSMutableDictionary、NSOrderedSet、NSSet的扩展,扩展方法基本上为

- (id)valueForKey:(NSString *)key;
- (void)setValue:(nullable id)value forKey:(NSString *)key;

也就是说,基本上Objective-C里所有的对象都支持KVC操作,操作包含如上两类方法,动态读取和动态设值。

 3> 通过KVC键值编码访问属性

  ① key值查找

1 [stu setValue:@"xiaoqiang" forKey:@"name"]; 
2 [stu setValue:@"boy" forKey:@"gender"];
3 [stu setValue:@24 forKey:@"age"]; 
4 
5 NSLog(@"name = %@, gender = %@, age = %@", [stu valueForKey:@"name"], [stu valueForKey:@"gender"], [stu valueForKey:@"age"]);

  ② 路径查找

1 Teacher *tea = [[Teacher alloc] init];
2 stu.teacher = tea;
3 [stu setValue:@"fangfang" forKeyPath:@"teacher.name"];
4 
5 // 路径查找
6 NSLog(@"teacherName = %@", [stu valueForKeyPath:@"teacher.name"]);

  ③ 同时给多个属性赋值

复制代码
 1 NSDictionary *dict = @{2                        @"name" : @"fangfang",3                        @"gender" : @"girl",4                        @"age" : @18,5                        @"hobby" : @"fangfang"6                        };7 Student *stu2 = [[Student alloc] init];8 9 // 同时给多个属性赋值
10 [stu2 setValuesForKeysWithDictionary:dict];
11 
12 NSLog(@"name = %@, gender = %@, age = %ld", stu2.name, stu2.gender, stu2.age);
复制代码

 4> KVC抛出异常的方法

  ① 使用KVC设置值对象时

   如果当前类没有找到对象的Key值,系统会自动调用 setValue: forUndefinedKey: 方法

   该方法的默认实现是抛出一个异常,如果不想抛出异常,就重写这个方法

1 // 重写
2 // 使用KVC设置值对象
3 - (void)setValue:(id)value forUndefinedKey:(NSString *)key
4 {
5     NSLog(@"不存在Key:%@", key);
6 }

  ② 使用KVC取值的时候

     如果当前类没有找到对应的Key值,系统会自动调用 valueForUndefinedKey: 方法

     该方法的默认实现是抛出一个异常,如果不想抛出异常,就重写这个方法

1 // 重写
2 // 使用KVC取值的时候
3 - (id)valueForUndefinedKey:(NSString *)key
4 {
5     return nil;
6 }

 5> KVC的实现机制 

  KVC按顺序使用如下技术:

  • 检查是否存在getter方法-<key>或者setter方法-set<key>:的方法;        
  • 如果没有上述方法,则检查是否存在名字为-_<key>、<key>的实例变量;        
  • 如果仍未找到,则调用 valueForUndefinedKey: 和 setValue: forUndefinedKey: 方法。这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。

KVO(Key Value Observer)

 1> 概述

  KVO:(Key Value Observer)键值观察者,是观察者设计模式的一种具体实现

  KVO触发机制:一个对象(观察者),监测另一对象(被观察者)的某属性是否发生变化,若被监测的属性发生的更改,会触发观察者的一个方法(方法名固定,类似代理方法)

 2> 一部分NSKeyValueObserving.h对于NSObject的拓展代码

复制代码
 1 @interface NSObject(NSKeyValueObserving)2 3 - (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary<NSString*, id> *)change context:(nullable void *)context;4 5 @end6 7 @interface NSObject(NSKeyValueObserverRegistration)8 9 - (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(nullable void *)context;
10 - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(nullable void *)context NS_AVAILABLE(10_7, 5_0);
11 - (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
12 
13 @end
复制代码

  从拓展名称就可以看出,使用KVO需要注册监听器,也需要删除监听器。监听过程需要使用observeValueForKeyPath回调方法。

 3> 使用步骤

  注册观察者(为被观察者指定观察者以及被观察属性)

复制代码
 1 // KVO 键值观察,是观察者设计模式2 @interface ViewController ()3 4 // 观察可变数组的改变情况(苹果官方文档不建议对数组进行观察)5 @property (nonatomic, strong) NSMutableArray *array;6 7 @end8 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     // Do any additional setup after loading the view, typically from a nib.
12     
13     self.array = [NSMutableArray array];
14     
15     // 第一步:注册观察者
16     // 参数1:添加的观察者对象
17     // 参数2:字符串标识的key
18     // 参数3:触发添加观察者对象的时候
19     /*
20      NSKeyValueObservingOptionNew = 0x01 key或value只要有一个更新的时候就会触发
21      NSKeyValueObservingOptionOld = 0x02
22      NSKeyValueObservingOptionInitial = 0x04
23      NSKeyValueObservingOptionPrior = 0x08
24      */
25     // 参数4:文本内容 一般为nil
26     [self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew context:nil];
27 }
复制代码

  
实现回调方法

复制代码
 1 // 第二步:实现回调2 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context3 {4     5     NSLog(@"keyPath = %@", keyPath);6     NSLog(@"object = %@", object);7     NSLog(@"change = %@", change);8     9     // 可以进行刷新UI的操作
10 }
复制代码

  触发回调方法(被观察属性发生更改)

复制代码
 1 // 第二步:实现回调2 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context3 {4     5     NSLog(@"keyPath = %@", keyPath);6     NSLog(@"object = %@", object);7     NSLog(@"change = %@", change);8     9     // 可以进行刷新UI的操作
10 }
复制代码

  移除观察者

   在不需要观察者的时候需要把它删除,本人就只在视图将要消失时移除

1 // 视图将要消失的时候
2 - (void)viewWillDisappear:(BOOL)animated
3 {
4     // 在不需要观察者的时候需要把它删除
5     [self removeObserver:self forKeyPath:@"array"];
6 }

 

转载于:https://www.cnblogs.com/VzhanggengD/p/6626326.html

http://www.lbrq.cn/news/2759779.html

相关文章:

  • 做网站相册百度网页网址
  • 新疆网站建设哪家好专业北京网站建设公司
  • thinkphp大型网站开发公司企业员工培训
  • 做网站运营的女生多吗自己怎么做网站推广
  • 游戏网站建设的必要性深圳最新新闻事件今天
  • 重庆市项目经理在建查询南宁seo推广优化
  • 做房产信息网站许昌网站seo
  • 中山网红长沙网站seo诊断
  • 网站建设的功能需求希爱力的功效及副作用
  • 电影网站做seo建材企业网站推广方案
  • 网站建设读后感搜索引擎营销概念
  • 无锡网站制作公司排名官方进一步优化
  • 深圳有哪些网站开发公司网站推广软件免费版
  • 百度推广区域代理黑帽seo工具
  • 旅游网站系统设计重庆seo外包平台
  • wordpress外贸B2C建站泉州全网营销推广
  • 深圳 网站科技山西网络推广
  • 网站改版定位策划书今日热点新闻头条
  • 湖北网络建设公司网站南京今天重大新闻事件
  • wordpress 最新漏洞班级优化大师官方网站
  • 网站建设武汉谷歌浏览器搜索引擎入口
  • 做miui主题网站广告投放平台有哪些
  • 中交建设集团网站无排名优化
  • 网站系统维护要多久百度在全国有哪些代理商
  • 许昌做网站团队武汉seo网站推广
  • 网站seo策略网络营销的营销理念
  • 网站建设流程分为三个步骤国内免费推广产品的网站
  • 职业生涯规划大赛演讲稿5分钟深圳网站seo服务
  • 关于网站空间百度搜索页
  • 怎么样用ps做网站百度网页版网址
  • Critic-V: VLM Critics Help Catch VLM Errors in Multimodal Reasoning(CVPR 2025)
  • LeetCode 分类刷题:2962. 统计最大元素出现至少 K 次的子数组
  • 【Spring Cloud 微服务】1.Hystrix断路器
  • Flink的状态管理
  • 以下是对智能电梯控制系统功能及系统云端平台设计要点的详细分析,结合用户提供的梯控系统网络架构设计和系统软硬件组成,分点论述并补充关键要点:
  • Mac(一)常用的快捷键整理