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 ...
随机推荐
- flash 遮住 div 解决办法
被遮盖的div 下面的代码 <!--列表菜单--> <div id="opreationmenu" style="posit ...
- golang单点推送
package main import ( "encoding/json" "flag" "fmt" "log" &qu ...
- Spark2.2,IDEA,Maven开发环境搭建附测试
前言: 停滞了一段时间,现在要沉下心来学习点东西,出点货了. 本文没有JavaJDK ScalaSDK和 IDEA的安装过程,网络上会有很多文章介绍这个内容,因此这里就不再赘述. 一.在IDEA上安装 ...
- Android 使用SQLite存储以及读取Drawable对象
在进行Android开发过程中,我们经常会接触到Drawable对象,那么,若要使用数据库来进行存储及读取,该如何实现? 一.存储 //第一步,将Drawable对象转化为Bitmap对象 Bitma ...
- Android MediaRecorder自定义分辨率
Android MediaRecorder自定义分辨率 工作这么久了,确实积累了不少东西,但都是以文档的形式存在U盘里的,为什么不写博客呢?因为懒啊!!!总感觉博客太难写了(大概是上学时候写作文恐惧症 ...
- 联想VIBE Shot(Z90-7/全网通) 解锁BootLoader
工具下载链接: http://pan.baidu.com/s/1dF7zGTb 备用下载链接: http://pan.baidu.com/s/1i4UHP4L 本篇教程教你如何傻瓜式解锁BootLoa ...
- php正则表达式应用
正则表达式 1.替换“/\d/”,“#”,$str:正则表达式\d 数字,替换为#,字符串 $str = "2hello 5li 6lei"; echo preg_replace( ...
- AI.框架理论.语义网.语言间距.孤单
刷个博客,转载自于科学网:AI.框架理论.语义网.语言间距.孤单 一:引言: AI几乎是计算机科学家的梦想,自动化比计算机发展的要早的多.早期的自动化节省了大量人力,激发了人类懒惰的滋长和对自身进化缓 ...
- 初识 Django
HTTP协议 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...
- eas之动态刷新Table
如何刷新表体数据行(表头不变) 示例1:删除所有表体行,并重新发取数事件该方法不会修改原先的绑定信息table.removeRows(); 示例2:删除所有表体行,修改绑定信息并重新取数指定新的que ...