zzz KVC/KVO原理详解及编程指南
一、简介
1、KVC简介
2、KVO简介
二、KVC相关技术
1、Key和Key Path
- - (id)valueForKey:(NSString *)key;
- - (void)setValue:(id)value forKey:(NSString *)key;
- - (id)valueForKeyPath:(NSString *)keyPath;
- - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
2、点语法和KVC
3、一对多关系(To-Many)中的集合访问器方法
- -countOf<Key>
- //必须实现,对应于NSArray的基本方法count:
- -objectIn<Key>AtIndex:
- -<key>AtIndexes:
- //这两个必须实现一个,对应于 NSArray 的方法 objectAtIndex: 和 objectsAtIndexes:
- -get<Key>:range:
- //不是必须实现的,但实现后可以提高性能,其对应于 NSArray 方法 getObjects:range:
- -insertObject:in<Key>AtIndex:
- -insert<Key>:atIndexes:
- //两个必须实现一个,类似于 NSMutableArray 的方法 insertObject:atIndex: 和 insertObjects:atIndexes:
- -removeObjectFrom<Key>AtIndex:
- -remove<Key>AtIndexes:
- //两个必须实现一个,类似于 NSMutableArray 的方法 removeObjectAtIndex: 和 removeObjectsAtIndexes:
- -replaceObjectIn<Key>AtIndex:withObject:
- -replace<Key>AtIndexes:with<Key>:
- //可选的,如果在此类操作上有性能问题,就需要考虑实现之
- -countOf<Key>
- //必须实现,对应于NSArray的基本方法count:
- -objectIn<Key>AtIndex:
- -<key>AtIndexes:
- //这两个必须实现一个,对应于 NSArray 的方法 objectAtIndex: 和 objectsAtIndexes:
- -get<Key>:range:
- //不是必须实现的,但实现后可以提高性能,其对应于 NSArray 方法 getObjects:range:
- -insertObject:in<Key>AtIndex:
- -insert<Key>:atIndexes:
- //两个必须实现一个,类似于 NSMutableArray 的方法 insertObject:atIndex: 和 insertObjects:atIndexes:
- -removeObjectFrom<Key>AtIndex:
- -remove<Key>AtIndexes:
- //两个必须实现一个,类似于 NSMutableArray 的方法 removeObjectAtIndex: 和 removeObjectsAtIndexes:
- -replaceObjectIn<Key>AtIndex:withObject:
- -replace<Key>AtIndexes:with<Key>:
- //这两个都是可选的,如果在此类操作上有性能问题,就需要考虑实现之
4、键值验证(Key-Value Validation)
- - (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
- - (BOOL)validate<Key>:error:
- -(BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError {
- // Implementation specific code.
- return ...;
- }
5、KVC对数值和结构体型属性的支持
- [person setValue:[NSNumber numberWithInteger:5] forKey:@"age"];
- [person valueForKey:@"age"];
这时,会以NSNumber的形式返回age的值。
- + (NSNumber *)numberWithChar:(char)value;
- + (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
- + (NSNumber *)numberWithShort:(short)value;
- + (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
- + (NSNumber *)numberWithInt:(int)value;
- + (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
- + (NSNumber *)numberWithLong:(long)value;
- + (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
- + (NSNumber *)numberWithLongLong:(long long)value;
- + (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
- + (NSNumber *)numberWithFloat:(float)value;
- + (NSNumber *)numberWithDouble:(double)value;
- + (NSNumber *)numberWithBool:(BOOL)value;
- + (NSNumber *)numberWithInteger:(NSInteger)value NS_AVAILABLE(10_5, 2_0);
- + (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value NS_AVAILABLE(10_5, 2_0);
总之就是一些常见的数值型数据。
- + (NSValue *)valueWithCGPoint:(CGPoint)point;
- + (NSValue *)valueWithCGSize:(CGSize)size;
- + (NSValue *)valueWithCGRect:(CGRect)rect;
- + (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;
- + (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets;
- + (NSValue *)valueWithUIOffset:(UIOffset)insets NS_AVAILABLE_IOS(5_0);
6、集合运算符(Collection Operators)
- NSNumber *transactionAverage = [transactions valueForKeyPath:@"@avg.amount"];
- NSNumber *numberOfTransactions = [transactions valueForKeyPath:@"@count"];
- @distinctUnionOfObjects
- @unionOfObjects
它们的返回值都是NSArray,区别是前者返回的元素都是唯一的,是去重以后的结果;后者返回的元素是全集。
- NSArray *payees = [transactions valueForKeyPath:@"@distinctUnionOfObjects.payee"];
- NSArray *payees = [transactions valueForKeyPath:@"@unionOfObjects.payee"];
前者会将收款人的姓名去除重复的以后返回,后者直接返回所有收款人的姓名。
- // Create the array that contains additional arrays.
- self.arrayOfTransactionsArray = [NSMutableArray array];
- // Add the array of objects used in the above examples.
- [arrayOfTransactionsArray addObject:transactions];
- // Add a second array of objects; this array contains alternate values.
- [arrayOfTransactionsArrays addObject:moreTransactions];
得到了一个包含集合的集合:arrayOfTransactionsArray
- @distinctUnionOfArrays
- @unionOfArrays
- @distinctUnionOfSets
- NSArray *payees = [arrayOfTransactionsArrays valueForKeyPath:@"@unionOfArrays.payee"];
三、实现原理
1、KVC如何访问属性值
2、KVC/KVO实现原理
派生类在被重写的 setter 方法实现真正的通知机制,就如前面手动实现键值观察那样。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要的通知机制。当然前提是要通过遵循 KVO 的属性设置方式来变更属性值,如果仅是直接修改属性对应的成员变量,是无法实现 KVO 的。
同时派生类还重写了 class 方法以“欺骗”外部调用者它就是起初的那个类。然后系统将这个对象的 isa 指针指向这个新诞生的派生类,因此这个对象就成为该派生类的对象了,因而在该对象上对 setter 的调用就会调用重写的 setter,从而激活键值通知机制。此外,派生类还重写了 dealloc 方法来释放资源。
- NSLog(@"self->isa:%@",self->isa);
- NSLog(@"self class:%@",[self class]);
- self->isa:Person
- self class:Person
- self->isa:NSKVONotifying_Person
- self class:Person
- - (void)willChangeValueForKey:(NSString *)key
- - (void)didChangeValueForKey:(NSString *)key
- - (void)observeValueForKeyPath:(NSString *)keyPath
- ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context
- - (void)willChangeValueForKey:(NSString *)key
- - (void)didChangeValueForKey:(NSString *)key
四、优点和缺点
1、优点
2、缺点
转载于:https://www.cnblogs.com/zengyanzhi/p/3955362.html
zzz KVC/KVO原理详解及编程指南相关推荐
- KVC/KVO原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注 ...
- Git 原理详解及实用指南
Git 原理详解及实用指南 什么是版本控制系统(VCS) 很多人认为 Git 难以理解的第一个门槛在于:所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚.其实分布式版本控制系统(Di ...
- git 原理详解及实用指南_如何编写良好的提交消息:实用的Git指南
git 原理详解及实用指南 To create a useful revision history, teams should first agree on a commit message conv ...
- 一天彻底搞懂 Git 《Git 原理详解及实用指南》
我是扔物线,Android 开发者,开源贡献者,在 GitHub 上有 4.9k followers 和 7.8k stars ,个人的 Android 开源库 MaterialEditText 被全 ...
- Git原理详解与实用指南
文章目录 上手 1:新公司用 Git 管理代码,怎么快速上手? 上手2:团队工作的基本工作模型 进阶1:HEAD.master与branch 进阶2:push的本质 进阶3:merge:合并commi ...
- Socket 套接字原理详解
Socket 套接字原理详解 socket 编程介绍 Socket编程封装了常见的TCP.UDP操作,可以实现非常方便的网络编程. socket() 函数介绍 # socket.socket(fami ...
- 并发编程五:java并发线程池底层原理详解和源码分析
文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...
- java编程实现arp欺骗_局域网 ARP 欺骗原理详解
局域网 ARP 欺骗原理详解 ARP 欺骗是一种以 ARP 地址解析协议为基础的一种网络攻击方式, 那么什么是 ARP 地址解析协议: 首先我们要知道, 一台电脑主机要把以太网数据帧发送到同一局域网的 ...
- LVS原理详解(3种工作方式8种调度算法)--老男孩
一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...
最新文章
- Git本地库版本控制和分支管理
- zabbix3.0.4监控mysql主从同步
- 模拟数据解决二分类问题项目描述
- matlab求半径范围内的点,matlab怎么快速搜索距离某点球形范围内的所有点
- 20190916:(leetcode习题) 二叉树的层次遍历
- 米家扩展程序初始化超时_一套完整的PLC程序是什么样子
- OC实现带弹跳动画按钮的界面控制器view
- 现任明教教主CCNP Security Secure第十一天视频共享
- 小数分频器vhdl实现_基于VHDL的小数分频器设计
- .mat转.tif 用于arcgis裁剪遥感图像
- Android 启程
- 【此后无良辰】实验13 FAT12文件系统
- 互联网域名系统国家工程中心(ZDNS)正式运营“.ren”顶级域名
- java调用百度内容审核接口检查文本
- Apollo Planning决策规划算法代码详细解析 (5):规划算法流程介绍
- word文档上粘贴源代码
- discuz论坛安装流程
- 代理服务器-CCProxy
- 视频直播CDN加速性能测试
- mysql 主键注解_oracle数据库中主键注解