kvc和kvo的使用情况的了解
了解cocoa:Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之中的一个(其他四个是Carbon、POSIX、X11和Java)。
苹果的面向对象开发框架,用来生成 Mac OS X 的应用程序。基本的开发语言为 Objective-c, 一个c 的超集。
即为:Coroa 基本面向原生的API抽象。是C的一个超级。
在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCoding(键值编码)/(键值观察)NSKeyValueObserving 非正式协议 的形式被定义为基础框架的一部分。
=
NSKeyValueCoding 是一个非正式的协议。(线管的内容能够看西面罗列的方法)
KVC/KVO实现的根本是Objective-C的 动态性和runtime
KVC/KVO机制离不开訪问器方法的实现。
kvc
相似c++中的map类的使用。
它提供了一种使用“字符串”而不是“訪问器(方法)”方法去訪问一个对象实例变量的机制。
kvo
提供了一种当其他对象属性被改动的时候能通知当前对象的机制.
KVO机制非常适合实现model和controller类之间的通讯。
总结全部的方法差点儿能够使用以下的四个方法为代表。
//一般的都是这几个方法
<span style="color:#990000;">- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;</span>
Key——>键值 , 就是要訪问的属性名称(key)相应的字符串。 (用数组(索引)的方式似乎没有什么区别) <span style="color:#CC0000;">- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;</span>
后面的KeyPath是一个被点操作符隔开的用于訪问对象的指定属性的字符串序列。(keypath 就是大范围到小范围逐渐到详细的地方)
eg:eyPath address.street将会訪问消息接收对象所包括的address属性中包括的一个street属性。
事实上KeyPath说白了就是我们平时使用点操作訪问某个对象的属性时所写的那个字符串。
点语法和kvc之间的区别:
在实现了訪问器方法的类中,使用点语法和KVC訪问对象事实上区别不大,二者能够随意混用。可是没有訪问起方法的类中,点语法无法使用,这时KVC就有优势了。( 原因见第三部分的第一节:KVC怎样訪问属性值。
) ??
一对多的关系:(数据中常常会存在)
①间接操作
先通过KVC方法取到集合属性,然后通过集合属性操作集合中的元素。
②直接操作 (基本上是不适用)
4、键值验证(Key-Value Validation)
KVC提供了验证Key相应的Value是否可用的方法:
- (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
该方法默认的实现是调用一个例如以下格式的方法:
- (BOOL)validate<Key>:error:
比方属性name相应的方法为:
-(BOOL)validateName:(id *)ioValue error:(NSError * __autoreleasing *)outError {
return ;
}
KVC是不会自己主动调用键值验证方法的 。就是说我们须要手动验证。可是有些技术,比方CoreData会自己主动调用。
5、KVC对数值和结构体型属性的支持
总结一下,想使用KVO有三种方法:
1)使用了KVC
使用了KVC,假设有訪问器方法,则执行时会在訪问器方法中调用 will/didChangeValueForKey:方法;
没用訪问器方法,执行时会在setValue:forKey方法中调用 will/didChangeValueForKey:方法。
2)有訪问器方法
执行时会重写訪问器方法调用 will/didChangeValueForKey:方法。
因此,直接调用訪问器方法改变属性值时,KVO也能监听到。
3)显示调用will/didChangeValueForKey:方法。
总之。想使用KVO,仅仅要有 will/didChangeValueForKey:方法就能够了。
③ _isKVOA
这个私有方法预计是用来标示该类是一个 KVO 机制声称的类。
长处和缺点
1、长处
①能够再非常大程度上简化代码
样例网上非常多。这就不举了
②能跟脚本语言非常好的配合
才疏学浅,没学过AppleScript等脚本语言,所以没能深刻体会到该长处。
2、缺点
KVC的缺点不明显,基本的kvo的缺点如连接:http://www.mikeash.com/pyblog/key-value-observing-done-right.html
核心思想是说KVO的回调机制,不能传一个selector或者block作为回调。而必须重写-addObserver:forKeyPath:options:context:方法所引发的一系列问题。问了解决问题。作者还亲自实现了一个MAKVONotificationCenter类。代码见github:
https://github.com/mikeash/MAKVONotificationCenter
只是个人觉得这仅仅是苹果做的KVO不够完美,不能算是缺陷。
关于NSKeyValueCoding.h这个文件爱你的属性的了解。
#import <Foundation/NSArray.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSOrderedSet.h>
#import <Foundation/NSSet.h> @class NSError, NSString; FOUNDATION_EXPORT NSString *const NSUndefinedKeyException;
FOUNDATION_EXPORT NSString *const NSAverageKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSCountKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfArraysKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfObjectsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSDistinctUnionOfSetsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSMaximumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSMinimumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSSumKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfArraysKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfObjectsKeyValueOperator;
FOUNDATION_EXPORT NSString *const NSUnionOfSetsKeyValueOperator; @interface NSObject(NSKeyValueCoding) + (BOOL)accessInstanceVariablesDirectly;
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
- (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;
- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);
- (NSMutableSet *)mutableSetValueForKey:(NSString *)key; - (id)valueForKeyPath:(NSString *)keyPath; //这个是有关路径的字符串。这个是怎么用的? - (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
- (BOOL)validateValue:(inout id *)ioValue forKeyPath:(NSString *)inKeyPath error:(out NSError **)outError; - (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath NS_AVAILABLE(10_7, 5_0);
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;
- (id)valueForUndefinedKey:(NSString *)key;
- (void)setValue:(id)value forUndefinedKey:(NSString *)key;
- (void)setNilValueForKey:(NSString *)key;
- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
@end //定的数组
@interface NSArray(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end //字典的两种方式进行组合
@interface NSDictionary(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
@end
@interface NSMutableDictionary(NSKeyValueCoding)
- (void)setValue:(id)value forKey:(NSString *)key;
@end @interface NSOrderedSet(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end @interface NSSet(NSKeyValueCoding)
- (id)valueForKey:(NSString *)key;
- (void)setValue:(id)value forKey:(NSString *)key;
@end #if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
//TARGET_OS_EMBEDDED这个表示是嵌入式的方式
//TARGET_OS_IPHONE iphone 开发
//TARGET_OS_MAC os系统开发 @interface NSObject(NSDeprecatedKeyValueCoding)
+ (BOOL)useStoredAccessor ;
- (id)storedValueForKey:(NSString *)key ;
- (void)takeStoredValue:(id)value forKey:(NSString *)key;
- (void)takeValue:(id)value forKey:(NSString *)key ;
- (void)takeValue:(id)value forKeyPath:(NSString *)keyPath ;
- (id)handleQueryWithUnboundKey:(NSString *)key;
- (void)handleTakeValue:(id)value forUnboundKey:(NSString *)key;
- (void)unableToSetNilForKey:(NSString *)key;
- (NSDictionary *)valuesForKeys:(NSArray *)keys ;
- (void)takeValuesFromDictionary:(NSDictionary *)properties; @end
#endif
kvc和kvo的使用情况的了解的更多相关文章
- 【原】iOS中KVC和KVO的区别
在iOS开发中经常会看到KVC和KVO这两个概念,比较可能混淆,特地区分一下 KVC(Key Value Coding) 1> 概述 KVC:Key Value Coding,键值编码,是一种间 ...
- iOS中关于KVC与KVO知识点
iOS中关于KVC与KVO知识点 iOS中关于KVC与KVO知识点 一.简介 KVC/KVO是观察者模式的一种实现,在Cocoa中是以被万物之源NSObject类实现的NSKeyValueCodin ...
- [原创]obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
原文链接:obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用 我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么 ...
- iOS开发中KVC、KVO简介
在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 ...
- obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用
我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么下面我们就用一个实际中的例子来看看KVC与KVO是如何运用的吧. 该例中用到了 ...
- Objective-C中的KVC与KVO(上)
本文转载 李朴之先生博客 http://blog.csdn.net/pucker/article/details/7413280 Objective-C中的KVC与KVO是两种比较重要的技术,这里简要 ...
- 我所认为的KVC和KVO
引子: 为什么要写这个,只是突然一个念头闪现,说一下本人目前理解.KVC: Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制.但是关就这一 ...
- 11. KVC And KVO
1. KVC And KVO 的认识 KVC/KVO是观察者模式的一种实现 KVC全称是Key-value coding,翻译成键值编码.顾名思义,在某种程度上跟map的关系匪浅.它提供了一种使用 ...
- iOS - 详细理解KVC与KVO
详细理解KVC与KVO 在面试的时候,KVC与KVO有些时候还是会问到的,并且他们都是Objective C的关键概念,在这里我们先做一个简单地介绍: (一)KVC: KVC即指:NSKeyValue ...
随机推荐
- ZOJ2477 Magic Cube
题目: This is a very popular game for children. In this game, there's a cube, which consists of 3 * 3 ...
- go并发编程 WaitGroup, Mutex
1.背景 记录一下,方便后续写代码直接使用. 需要注意几点: chan 默认支持多协程工作,不需要加锁. 其他变量操作需要使用锁保护(map多协程并发写会panic, 并且无法捕获). 启动gorou ...
- 点开,看一段,你就会喜欢上学习pandas,你该这么学!No.3
身为一个啰嗦的博主,还是要说点啥,如果你不想学,直接拖拽到最后,发现彩蛋,然后3秒 我呢,有个小目标,就是把技术类的文章,写的有趣 编程呢,最难的是什么? 我投票给入门 其实,把一个人带进编程的大门是 ...
- CAS配置记录
CAS配置(1)之证书配置 CAS配置(2)之主配置 CAS配置(3)之restful-api接入接口
- 汇编程序10:计算长度为C字节的数据和
assume cs:code code segment mov ax,0ffffh //起始段地址 mov ds,ax mov bx,0 //偏移变量 mov dx,0 //保存结果 mov cx,1 ...
- [hihocoder][Offer收割]编程练习赛50
循环数组 计算a[i]的前缀和s[i],计算l[i]为1~i-1中最小的s值,r[i]为i~n中最大的s值. 则a[i]~a[n]满足性质的条件为r[i]-s[i-1]>0,a[1]~a[i-1 ...
- Linux通信之poll机制分析
poll机制分析 韦东山 2009.12.10 所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数.比如系统调用open.read.write.poll,与之对应的 ...
- dubbo之泛化引用
使用泛化调用 泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 Gene ...
- 自定义View实现拖动小圆球,并随机改变其颜色
//简单实现package com.example.demo1; import android.content.Context;import android.graphics.Canvas;impor ...
- Docker拉取images时报错Error response from daemon
docker拉取redis时,抛出以下错误: [master@localhost ~]$ docker pull redis Using default tag: latest Error respo ...